Winsock:DisconnectEx与IO完成端口

时间:2014-06-24 22:49:01

标签: sockets winsock winsock2 io-completion-ports

注意:OP在评论帖中确认问题是由于拼写错误引起的,未在发布的代码中显示。


我希望在使用DisconnectEx安排重叠断开连接后,使用GetQueuedCompletionStatus获取通知。我从来没有得到过 - 这是设计的吗?如果我在OVERLAPPED结构中指定手动重置事件,则会发出信号以指示断开连接已完成,但GetQueuedCompletionStatus永远不会返回。

我对DisconnectEx的调用看起来有点像这样(注意上下文有一个运算符LPOVERLAPPED,ol是结构中的第一个元素):

context.ol.hEvent = hEvent;
BOOL result = DisconnectEx(context.socket, context, TF_REUSE_SOCKET, 0);
if (result)
{
    // we completed synchronously:
    ProcessCompletion(0, context, 0);
}
else
{
    int error = WSAGetLastError();
    if (error != ERROR_IO_PENDING)
    {
        throw ServerSocketException("DisconnectEx failed");
    }
    WaitForSingleObject(hEvent, INFINITE);
    std::cout << "disconnected - event signalled\n";
}

当我发现GetQueuedCompletionStatus没有返回时,我添加了WaitForSingleObject。检测DisconnectEx完成的正确方法是什么?我想在调用AcceptEx时再次使用套接字。

1 个答案:

答案 0 :(得分:0)

appears这是因为OP部分的拼写错误。

(发布答案,以便其他人不必阅读评论主题......)