实现涉及windows HANDLE对象的拷贝构造函数

时间:2013-01-16 21:08:50

标签: c++ constructor copy winsock handle

在使用win32 API时,我是新手,所以请耐心等待。

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

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

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

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

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

ServerConnection.h

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

    virtual HANDLE getAcceptEvent();

    virtual void setAcceptEvent(HANDLE eventObj);

protected:

private:

    HANDLE assocAcceptEvent;

    //..other variables...
};

ServerConnection.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
}

1 个答案:

答案 0 :(得分:4)

你无法以合理的方式复制句柄(即DuplicateHandle没有做你想做的事情),这让我觉得这个对象不应该是可复制的...... < / p>

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

我不知道答案,因为我不知道你的整体设计是什么意思与ServerConnection有关 - 但事实上它说ServerConnection使我认为它是某种“连接”的东西,因此不能轻易复制。