1

注意: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 的调用中再次使用套接字。

4

1 回答 1

0

看来这是因为 OP 的拼写错误

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

于 2016-12-07T09:37:23.523 回答