如何保证WSASend及时完成?

shaohongqiang 2008-01-14 10:02:17
我采用IOCP模型在多连接大数据量测试的时候,发现有的发送无法及时完成,也就是WSASend在执行后,经过十多分钟以后GetQueuedCompletionStatus也无法受到WSASend的完成信号,有时执行了多次(例如几十次)WSASend操作后,这些操作都会不返回完成信号。但是有时等待几分钟后这些未完成的WSASend的又会在几秒钟内立即完成。

我有以下几个问题:
1.这种情况是不是经常发生,大家都有碰到过吗?
2.对这种情况有什麽应对方法?
3.如何才能保证WSASend及时完成?因为我见到网上有个兄弟说:有时客户端明明已经收到数据了,但是服务器的发送端仍然不提示发生成功,这种状况如何应对?

请各位高手指教,万分感谢!

...全文
151 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaohongqiang 2008-01-17
  • 打赏
  • 举报
回复
小顶一下......
newone2007 2008-01-14
  • 打赏
  • 举报
回复
楼主提的问题蛮好的,我也想知道另一个情况,不知道哪位楼主或哪位朋友给解释一下吗?

在投递WSASend或WSARecv后,在GetQueuedCompletionStatus中如何判断投递的发送或接收超时,并关闭相关的SOCKET?
僵哥 2008-01-14
  • 打赏
  • 举报
回复
投递的未决WSASend过多,卖到核心内存的过度占用。
shaohongqiang 2008-01-14
  • 打赏
  • 举报
回复
我是根据发送或接收时间判断超时的。
比如对接收而言,程序的心跳包的周期是2分钟,如果超过设定时间(比如5分钟)还没有收到客户端的数据,就认为网络连接异常,关闭之。
对发送而言我也采用类似的方式,发送后等待完成返回,如果在等待时间内再次有发送请求先保存到缓冲区,等上次发送完成后再将缓冲区的数据发送。如果等待长时间,发送还未完成就认为网络连接异常,关闭之。

这里有个帖子讨论的是发送超时的问题,你可以看一下,但是好像他们也没有彻底解决问题。
http://bbs.zxbc.cn/archiver/tid-33888.html

请高手指点,万分感谢。

18,356

社区成员

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

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