在完成端口中,如果关闭一个SOCKET连接,不会产生程序崩溃

清水火 2010-07-08 03:46:39
哪位帅哥对完成端口模型熟悉些。有个问题请教一个:

1、建立一个SOCKET连接通过CreateIoCompletionPort()关联上一个完成端口。
2、用WSARecv投递接收数据事件,并将股递的Overlapped结构(是new出来的)指针保存在一个链表中。。用WSAsend投递发送数据事件,并将股递的Overlapped结构保存在另一个链表中。。

现在我要主动的关闭这个连接。这个地方需要怎么做?
我碰到的问题是:在关闭这个连接。如果我直接就closesocket的话。然后就将与这个连接相关的Overlapped缓冲区从两个链表中删除,但是这样的话,好像存在一个问题,假如这个两个股递的动作已经产生。内核正在接收数据,也就是说正在使用投递的BUF,而我却在这时产生了一个删除动作,那程序不是会崩掉,那我应该如果做才能解决这个问题呢?
...全文
278 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xgPaul 2010-07-11
  • 打赏
  • 举报
回复
用GetQueuedCompletionStatus处理。。。
lijianli9 2010-07-10
  • 打赏
  • 举报
回复
根据GetQueuedCompletionStatus的返回值判断吧,也就是你提交的IO请求返回后,
来灵 2010-07-08
  • 打赏
  • 举报
回复
如果你主动关闭连接的话,GetQueuedCompletionStatus会进行响应的。此时你的单I/O和单句柄结构体指针都不为空,GetLastError() 是ERROR_OPERATION_ABORTED,你接着处理吧。
waitforsomebody 2010-07-08
  • 打赏
  • 举报
回复
在GetQueueStatus..函数中增加错误处理代码,断开连接(不管是主动还是被动)时会在该函数中接收到断开信息的 ,可以通过错误码、单连接句柄、单数据句柄来判断。 你可以看一下其他人的示例,一般都会有这段处理

18,356

社区成员

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

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