iocp怎么主动关闭socket?

qq_29817615 2020-07-13 03:42:15
多线程中 如果closesocket的时候 , 正好新的socket连接进来,如果2次socket句柄 相等, wsasend 和 wsarecv函数 应该会投递到新的socket上.造成数据异常
这个可能是有的吧? 但是我看所有的iocp例子都没有考虑这个问题
只有当关闭socket后 并且保证不会再调用 wsasend wsarecv 才会保证传输数据安全吧?
...全文
237 11 打赏 收藏 转发到动态 举报
写回复
用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。作为标识及参数以提供控制。

64,644

社区成员

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

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