IOCP之超时连接关闭Socket

hnu_0720 2015-07-11 09:23:58
最近在学习IOCP完成端口,现在遇到一个问题想请教一下大家.
我准备定时检查所有Socket的连接,如果发现有过长时间没有交互数据,就关闭这个连接.
现在问题来了:怎么关闭呢?
我的打算是用PostQueuedCompletionStatus 这个API,然后在线程里面 GetQueuedCompletionStatus 的时候 关闭这个连接
我现在担心的是,由于是多线程的,如果在我关闭的时候,这个Socket又开始交互数据了?
大家又什么好的做法了,请指导一下.谢谢了
...全文
300 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnu_0720 2015-07-13
  • 打赏
  • 举报
回复
引用 5 楼 xian_wwq 的回复:
[quote=引用 2 楼 hnu_0720 的回复:] [quote=引用 1 楼 xian_wwq 的回复:] 通过PostQueuedCompletionStatus 处理是正确的 在工作线程中把closesocket的操作收拢到一处 就没有问题了
刚学习,不清楚完成端口的内部操作,能说详细一点吗? 我的业务流程是这样的.最开始的时候我接收到了客户端的连接,然后投递了WSARecv用来接收客户端发送的数据, 但是客户端很久也没有发送数据,我就判定这个连接是一个恶意连接或者是已经断开的连接, 通过PostQueuedCompletionStatus 给完成端口发送一个完成信息,然后在工作线程里面处理这个完成信息的时候closesocket. 我现在的疑问是: 1) 在我PostQueuedCompletionStatus的时候,完成端口队列已经有一个WSARecv的完成信息了 2) 在我PostQueuedCompletionStatus的之后,完成端口队列接收到了一个WSARecv的完成信息. 这个时候我在一个线程里面closesocket,而另外的一个线程又在做业务.怎么办呢?[/quote] 从业务流程来说,都是一问一答,所以不会出现多个线程同时处理一个socket; 单个socket,如果close掉,这个socket上所有的未完成的投递就会返回。 在Server侧肯定有个客户端socket的容器,如果返回投递的socket在容器中已经找不到, 说明已经被关闭了,直接释放资源就可以 [/quote] 业务上的确是你说的这样,不过我现在是在一个单独的线程轮询所有的SOCKET,判断SOCKET是否超时,如果超时就关闭连接,我就是怕我关闭连接的时候,其他线程还在使用这个SOCKET
xian_wwq 2015-07-13
  • 打赏
  • 举报
回复
引用 2 楼 hnu_0720 的回复:
[quote=引用 1 楼 xian_wwq 的回复:] 通过PostQueuedCompletionStatus 处理是正确的 在工作线程中把closesocket的操作收拢到一处 就没有问题了
刚学习,不清楚完成端口的内部操作,能说详细一点吗? 我的业务流程是这样的.最开始的时候我接收到了客户端的连接,然后投递了WSARecv用来接收客户端发送的数据, 但是客户端很久也没有发送数据,我就判定这个连接是一个恶意连接或者是已经断开的连接, 通过PostQueuedCompletionStatus 给完成端口发送一个完成信息,然后在工作线程里面处理这个完成信息的时候closesocket. 我现在的疑问是: 1) 在我PostQueuedCompletionStatus的时候,完成端口队列已经有一个WSARecv的完成信息了 2) 在我PostQueuedCompletionStatus的之后,完成端口队列接收到了一个WSARecv的完成信息. 这个时候我在一个线程里面closesocket,而另外的一个线程又在做业务.怎么办呢?[/quote] 从业务流程来说,都是一问一答,所以不会出现多个线程同时处理一个socket; 单个socket,如果close掉,这个socket上所有的未完成的投递就会返回。 在Server侧肯定有个客户端socket的容器,如果返回投递的socket在容器中已经找不到, 说明已经被关闭了,直接释放资源就可以
hnu_0720 2015-07-12
  • 打赏
  • 举报
回复
引用 1 楼 xian_wwq 的回复:
通过PostQueuedCompletionStatus 处理是正确的 在工作线程中把closesocket的操作收拢到一处 就没有问题了
刚学习,不清楚完成端口的内部操作,能说详细一点吗? 我的业务流程是这样的.最开始的时候我接收到了客户端的连接,然后投递了WSARecv用来接收客户端发送的数据, 但是客户端很久也没有发送数据,我就判定这个连接是一个恶意连接或者是已经断开的连接, 通过PostQueuedCompletionStatus 给完成端口发送一个完成信息,然后在工作线程里面处理这个完成信息的时候closesocket. 我现在的疑问是: 1) 在我PostQueuedCompletionStatus的时候,完成端口队列已经有一个WSARecv的完成信息了 2) 在我PostQueuedCompletionStatus的之后,完成端口队列接收到了一个WSARecv的完成信息. 这个时候我在一个线程里面closesocket,而另外的一个线程又在做业务.怎么办呢?
hnu_0720 2015-07-12
  • 打赏
  • 举报
回复
引用 3 楼 mengfeihong 的回复:
"标准"的,符合微软范例的iocp用法,对同一socket的线程调用是串行的,也就是对同一个socket,不会有并发的线程,这是我之前的研究结果。
好的,谢谢你.
蒙飞鸿 2015-07-12
  • 打赏
  • 举报
回复
"标准"的,符合微软范例的iocp用法,对同一socket的线程调用是串行的,也就是对同一个socket,不会有并发的线程,这是我之前的研究结果。
xian_wwq 2015-07-11
  • 打赏
  • 举报
回复
通过PostQueuedCompletionStatus 处理是正确的 在工作线程中把closesocket的操作收拢到一处 就没有问题了

18,363

社区成员

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

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