关于完成端口中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一定会关闭呢?
...全文
247 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦断酒醒 2005-09-23
  • 打赏
  • 举报
回复
看来只能这样了。
ximenying 2005-09-22
  • 打赏
  • 举报
回复
对,你也可以将你关心的其它信息也通过这种方式保存起来,肯定要自己计时啊,有什么不方便吗?我想很多游戏服务器可能会这样使用吧
梦断酒醒 2005-09-22
  • 打赏
  • 举报
回复
1.按楼上的说法,是不是做一个socket的列表才行?
2.那如何取得客户端上次发数据到现在的时间长度呢?是自己来计时吗?socket有没有现成的机制?
ximenying 2005-09-22
  • 打赏
  • 举报
回复
这个应该由服务器端来维护客户端的连接信息,当你发现某个客户端超过一段时间没有收发过数据,就应该将它关闭,客户端需要发送请求时让它重连
梦断酒醒 2005-09-22
  • 打赏
  • 举报
回复
请知道的指教一二,在下感激不尽!
梦断酒醒 2005-09-21
  • 打赏
  • 举报
回复
估计它的关闭是在程序退出的时候
==========================================

要是这样,服务程序不是运行不长就得重启了。资源浪费太严重了吧?
nuaawenlin 2005-09-21
  • 打赏
  • 举报
回复
return 0;
退出了线程

估计它的关闭是在程序退出的时候

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧