iocp怎么主动关闭socket?

qq_29817615 2020-07-13 03:42:15
多线程中 如果closesocket的时候 , 正好新的socket连接进来,如果2次socket句柄 相等, wsasend 和 wsarecv函数 应该会投递到新的socket上.造成数据异常
这个可能是有的吧? 但是我看所有的iocp例子都没有考虑这个问题
只有当关闭socket后 并且保证不会再调用 wsasend wsarecv 才会保证传输数据安全吧?
...全文
269 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-08-07
  • 打赏
  • 举报
回复
socket连接进来时没有什么标识区分吗?那你怎么控制给不同的socket发送不同的消息?
sdghchj 2020-08-07
  • 打赏
  • 举报
回复
了解一下连接关闭4次挥手过程吧。主动关闭方要等2*MSL时间后才会最终停止,就是为了保证连接完全断开从而区分前后两次连接。 主动close之后,就不能再send (send 会报"use of close connection"之类的错误,可作适当处理),只能receive。 当对方close之后,己方循环receive,直到收到EOF。正常结束。
qq_29817615 2020-08-07
  • 打赏
  • 举报
回复
目前的解决办法是是坚信 wsarecv 同步返回,肯定是因为socket出现异常 . 我看微软的例子 ,如果wsarecv 同步正常返回数据 就会造成无限递归. 在这个前提下 我才写出了socket 的主动closesocket.目前测试没有问题
qq_29817615 2020-08-07
  • 打赏
  • 举报
回复
自己已经解决了 不谈论了, 最终结果 就是完成端口 wasrecv wsasend 100%的不会同步的成功的收发数据. 应该是msdn 文档没说清除,并且msdn 的官方实例代码也显示了 wasrecv wsasend 100%的不会同步的成功的收发数据.
qq_29817615 2020-08-07
  • 打赏
  • 举报
回复
引用 6 楼 sdghchj 的回复:
了解一下连接关闭4次挥手过程吧。主动关闭方要等2*MSL时间后才会最终停止,就是为了保证连接完全断开从而区分前后两次连接。 主动close之后,就不能再send (send 会报"use of close connection"之类的错误,可作适当处理),只能receive。 当对方close之后,己方循环receive,直到收到EOF。正常结束。
已方循环回收不会出现问题? 当收到数据 处理数据 ,再recv ,假如处理数据的时间足够长, 你再recv 发现收到其他socket 的数据了
sdghchj 2020-08-07
  • 打赏
  • 举报
回复
引用 8 楼 qq_29817615 的回复:
[quote=引用 6 楼 sdghchj 的回复:]了解一下连接关闭4次挥手过程吧。主动关闭方要等2*MSL时间后才会最终停止,就是为了保证连接完全断开从而区分前后两次连接。 主动close之后,就不能再send (send 会报"use of close connection"之类的错误,可作适当处理),只能receive。 当对方close之后,己方循环receive,直到收到EOF。正常结束。
我就是说的你说的情况 close之后理论上不可以send , 但是close 后 立马新的连接进来 ,正好和close 的句柄一样,你会发现close后的对象可以send了[/quote]你自己排查
qq_29817615 2020-08-07
  • 打赏
  • 举报
回复
引用 6 楼 sdghchj 的回复:
了解一下连接关闭4次挥手过程吧。主动关闭方要等2*MSL时间后才会最终停止,就是为了保证连接完全断开从而区分前后两次连接。 主动close之后,就不能再send (send 会报"use of close connection"之类的错误,可作适当处理),只能receive。 当对方close之后,己方循环receive,直到收到EOF。正常结束。
我就是说的你说的情况 close之后理论上不可以send , 但是close 后 立马新的连接进来 ,正好和close 的句柄一样,你会发现close后的对象可以send了
qq_29817615 2020-07-13
  • 打赏
  • 举报
回复
我在msdn 看的c++ 和c# 关于iocp的例子, 全部都是在异步完成中出现异常调用closesocket (被动关闭) 并没有服务器主动调用closesocket的例子,目前我想知道主动调用closesocket 在什么情况下是绝对安全的? closesocket 对已经投递的wsarecv和wsasend 是安全的吧? 如果已经closesocket 以后再次调用 wsasend和wsarecv 才会出现问题吧? 或者谁有服务器主动关闭iocp的例子
smwhotjay 2020-07-13
  • 打赏
  • 举报
回复
有几种办法。 1.不用closesocket,而是重用socket,避免关闭创建socket开销。 2.closesocket,异步send recv会受信,iocp查询会得到消息, iocp比较麻烦的就是管理异步io,(多异步recv io投递等等).避免内存泄漏。
qq_29817615 2020-07-13
  • 打赏
  • 举报
回复
目前是用个bool connneted字段 和 锁 ,但是我看所有iocp的例子都没考虑这个问题 , 有点迷茫
千梦一生 2020-07-13
  • 打赏
  • 举报
回复
写个id啊。连接上的线程都对外出示一个id。作为标识及参数以提供控制。
完成端口通讯服务器(IOCP Socket Server)设计 (六)功能强大的IOCP Socket Servre模块例程源码 Copyright © 2009 代码客(卢益贵)版权所有 QQ:48092788 源码博客:http://blog.csdn.net/guestcode 一、声明 版权声明: 1、通讯模块代码版权归作者所有; 2、未经许可不得全部或部分用于任何项目开发; 3、未经许可不得部分修改后再利用源码。 免责声明: 1、 由于设计缺陷或其它Bug造成的后果,作者不承担责任; 2、未经许可的使用作者不提供任何技术支持服务。 权利和义务: 1、任何获得源码并发现Bug的个人或单位均有义务向作者反映; 2、作者保留追究侵权者法律责任的权利。 二、开发背景 部分代码由前项目分离而来,尚未有应用考验,但对于初学者学习和进阶有很大帮助。性能上尚未有定论,但应该不会令你失望。 三、功能说明 1、可以关闭Socket的Buffer; 2、可以关闭MTU(不等待MTU满才发送); 3、可以多IP或多端口监听; 4、可以重用socket主动关闭除外); 5、可以0缓冲接收(Socket的Buffe = 0时,避免过多的锁定内存页); 6、可以0缓冲连接(客户端仅连接,不一定立即发数据); 7、可以条件编译: a、是否使用内核Singly-linked lists; b、是否使用处理线程(工作线程和处理线程分开); c、是否使用内核锁来同步链表。 8、可以实现集群服务器模式的通讯(有客户端socket); 9、可以单独设置每个连接的Data项来实现连接和Usernfo的关联; 10、每个线程有OnBegin和OnEnd,用于设置线程独立的对象(数据库会话对象); 11、可以提供详细的运行情况,便于了解IOCP下的机制,以及进行调试分析; 12、可以发起巨量连接和数据(需要硬件配置来支持)。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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