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