关于完成端口中socket的关闭问题
梦断酒醒 2005-09-21 04:28:02 正在学完成端口,教程中的一个例子发现有点问题:
if (GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
(LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE) == 0)
{
printf("GetQueuedCompletionStatus failed with error %d\n", GetLastError());
return 0;
}
if (BytesTransferred == 0)
{
printf("Closing socket %d\n", PerHandleData->Socket);
if (closesocket(PerHandleData->Socket) == SOCKET_ERROR)
{
printf("closesocket() failed with error %d\n", WSAGetLastError());
return 0;
}
GlobalFree(PerHandleData);
GlobalFree(PerIoData);
continue;
}
在工作线程中先用GetQueuedCompletionStatus等待,当BytesTransferred == 0成立时关闭socket,但是我发现,当客户程序关闭socket或退出时,GetQueuedCompletionStatus的返回值为0,这样就不会执行关闭服务器侧socket的代码了。
那么如何才能确保服务程序中的socket一定会关闭呢?