1

我是使用win32 API的新手,所以请多多包涵。

我目前正在处理一个涉及 Winsock 的 C++ 项目,但我对使用事件对象 HANDLE 类型的复制构造函数的正确方法感到困惑。

概述(代码如下):在尝试使用 IOCP 并保持一切可扩展性时,我有一个线程来检查多个接受事件。每个 ServerConnection 对象都拥有自己的由 WSACreateEvent() 创建的接受事件对象、其关联的低级套接字和相关的状态/变量。

我的问题是,我试图实现“三巨头”,但我不太确定应该如何“复制”句柄。

DuplicateHandle() 似乎创建了一个新句柄,但它指向同一个对象,但这对于 ServerConnection “副本”而言没有意义(我们想要一个具有相同状态的新对象,对吧?)。

至于使用复制赋值运算符,我不确定它会对事件对象 HANDLE 做什么。

服务器连接.h

class ServerConnection
{
public:
    //...constructors, destructors, etc...

    virtual HANDLE getAcceptEvent();

    virtual void setAcceptEvent(HANDLE eventObj);

protected:

private:

    HANDLE assocAcceptEvent;

    //..other variables...
};

服务器连接.cpp

ServerConnection::ServerConnection(ServerConnection &that)
{
   //blah blah...other vars

   //? This does not seem right as the HANDLE is logically a pointer;
   //Assigning like this just points another handle to the same event obj
   //If the other ServerConnection object closes the handle...not good.
   this.assocAcceptEvent = that.assocAcceptEvent;

   //The only thing that make slightly more sense, is just to create a whole new one
   //if I answered my own question, then great...but I wanted to make sure
   this.assocAcceptEvent = WSACreateEvent(); 

   //assume check for WSACreateEvent failing with WSAGetLastError() and
   //handle appropriately
}
4

1 回答 1

5

您无法以合理的方式复制句柄(即,DuplicateHandle不做您想做的事)这一事实使我认为该对象不应该是可复制的......

您必须问自己的问题是:ServerConnection 的副本实际上意味着什么?你会在哪里/如何使用它?

我不知道答案,因为我不知道您的整体设计对 ServerConnection 意味着什么 - 但它说 ServerConnection 的事实让我认为它是“连接”到某物的东西,因此不能轻易复制。

于 2013-01-16T21:13:07.940 回答