IOCP 非阻塞socket的WSASend问题

lihuixian001 2012-12-12 01:21:21
我对socket设置了非阻塞模式
 ioctlsocket(Socket, FIONBIO, (unsigned long*)&ul);

打算对每个连接投递0字节的WSARevc,
然后GetQueuedCompletionStatus返回的时候
用非阻塞的recv根据消息头读取一个个完整的逻辑包

现在问题是:
使用了非阻塞模式之后,
WSASend调用之后,GetQueuedCompletionStatus会立即返回结果
我试验了一下阻塞和非阻塞的socket分别发送100m缓存的情况,
发现阻塞socket会等到对等方接收完毕之后GetQueuedCompletionStatus才返回
而非阻塞的socket会立即返回结果
感觉如果使用非阻塞模式的话,就不能对发送情况进行监控了
请问各位有经验的大大有什么好的解决办法?
...全文
1256 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxliangzyt 2013-11-15
  • 打赏
  • 举报
回复
WSASend调用之后,GetQueuedCompletionStatus会立即返回结果 等方接收完毕之后GetQueuedCompletionStatus才返回
xhz8000 2013-11-13
  • 打赏
  • 举报
回复
我从没有投递0字节接收过! 因为我的客户数量不是很大
fishion 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 lihuixian001 的回复:
[quote=引用 2 楼 VisualEleven 的回复:] 打算对每个连接投递0字节的WSARevc, 然后GetQueuedCompletionStatus返回的时候 用非阻塞的recv根据消息头读取一个个完整的逻辑包 ------------------ 说错了吧,WSARecv投递0字节的包,然后等待GetQueuedCompletionStatus返回,判断是接收数据,调用阻塞recv函数循环接收数据。 WS……
0字节完成通知的时候,调用阻塞recv循环接收的时候不怕阻塞在那里的吗?[/quote] IOCP投递0字节接收本来就是这个过程的,不用设置非阻塞属性,GetQueuedCompletionStatus返回后循环接收,这样的做法是减少了内存的损耗,但降低了效率
wxliangzyt 2013-11-07
  • 打赏
  • 举报
回复
WSASend调用之后,GetQueuedCompletionStatus会立即返回结果 我试验了一下阻塞和非阻塞的socket分别发送100m缓存的情况, 发现阻塞socket会等到对等方接收完毕之后GetQueuedCompletionStatus才返回 而非阻塞的socket会立即返回结果 感觉如果使用非阻塞模式的话,就不能对发送情况进行监控了
lihuixian001 2012-12-12
  • 打赏
  • 举报
回复
引用 2 楼 VisualEleven 的回复:
打算对每个连接投递0字节的WSARevc, 然后GetQueuedCompletionStatus返回的时候 用非阻塞的recv根据消息头读取一个个完整的逻辑包 ------------------ 说错了吧,WSARecv投递0字节的包,然后等待GetQueuedCompletionStatus返回,判断是接收数据,调用阻塞recv函数循环接收数据。 WS……
0字节完成通知的时候,调用阻塞recv循环接收的时候不怕阻塞在那里的吗?
Eleven 2012-12-12
  • 打赏
  • 举报
回复
打算对每个连接投递0字节的WSARevc, 然后GetQueuedCompletionStatus返回的时候 用非阻塞的recv根据消息头读取一个个完整的逻辑包 ------------------ 说错了吧,WSARecv投递0字节的包,然后等待GetQueuedCompletionStatus返回,判断是接收数据,调用阻塞recv函数循环接收数据。 WSASend调用之后,GetQueuedCompletionStatus会立即返回结果 我试验了一下阻塞和非阻塞的socket分别发送100m缓存的情况, 发现阻塞socket会等到对等方接收完毕之后GetQueuedCompletionStatus才返回 而非阻塞的socket会立即返回结果 感觉如果使用非阻塞模式的话,就不能对发送情况进行监控了 ---------------------------------------- WSASend以后你需要判断一下返回值,WSAGetLastError()等等
ShengFei01 2012-12-12
  • 打赏
  • 举报
回复
如果是TCP的话,你不需要关心数据的发送,可靠性由协议保证。如果用UDP,需要对方给你确认才可以。这有些socket的例子,你可以参考: http://download.csdn.net/detail/geoff08zhang/4571358

18,356

社区成员

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

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