iocp关闭的小问题

zhangyanli 2008-05-16 04:29:24
1.当多个线程在套接字上执行I/O 操作时,应当避免重叠操作正在进行的时候释放了OVERLAPPED 结构,阻止其发生的最好方法是在每个套接字句柄上调用closesocket函数--------------所有未决的I/O 操作都会完成

为什么?

2.上述方法可以通过使用PostQueuedCompletionStatus函数向工作线程发送特定的完成封包来实现,这个完成封包通知工作线程立即退出

发送什么样的封包呢?

3.当工作线程接收GetQueuedCompletionStatus的3个参数时,可以决定是否退出。

发送什么样的参数呢?dwCompletionkey传递0.

其实这三个问题是一个问题,书上说的很模糊,我把它分开问,各位高手回答也方便一些,我也更容易理解一些,拜托了。
...全文
173 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2008-05-16
  • 打赏
  • 举报
回复
1.如果能这样子做当然是最好不过,通常这种也是比较理想的。即先关闭Listen Socket,然后socket逐一关闭。
2,3.是同一个问题。问题1当中这种理想做法很难实现,几乎是不可能实现。那么就只要做到不让后续的线程重复释放资源。做法就是先给每一个线程发送一个退出的通知,这个通知可以通过PostQueuedCompletionStatus带上特定的参数,当GetQueuedCompletionStatus收到特定的参数之后,就自行退出,而不再处理后续的通知。如此就可以避免了对野指针释放资源的问题。
kikistorm 2008-05-16
  • 打赏
  • 举报
回复
1:关闭每个关联到完成端口的socket,
2,3:PostQueuedCompletionStatus(m_hCompletion, -1, 0, NULL);
BOOL bOK = ::GetQueuedCompletionStatus(m_hCompletion, &dwTrans, (LPDWORD)&dwKey, (LPOVERLAPPED*)&lpol, WSA_INFINITE);
if(dwTrans == -1) // 用户通知退出,你自己决定是对否退出
{

}

18,356

社区成员

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

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