IOCP在什么时机投递WSA_RECV?

白虹李李 2010-10-19 02:45:54
一般来说WSA_SEND在什么地方投递都比较清楚,在需要主动SEND的时候和收到了消息需要响应时。
但什么时候投递WSA_RECV呢?

考虑一个客户端和一个服务端,都采用IOCP。
客户端采用定时器定时在多个链路上发送消息到服务端(循环发送大量数据,进行性能测试用),服务端则返回响应。

最开始的时候我在工作线程中GetQueuedCompletionStatus,检查到WSA_SEND完成了或者WSA_RECV完成了,就来投递一个新的WSA_RECV,后来发现会丢失响应。
后来我在客户端和服务端建立连接的时候,就在每个链路上都投递一个WSA_RECV,然后检查到WSA_SEND完成或者WSA_RECV完成,再次投递一个WSA_RECV。好像也有问题。
我必须在服务端Sleep一下再返回响应,才能接收正确。
请教一下高手,一般在什么地方投递WSA_RECV?

关于IOCP一直有一个疑问,如果服务端返回了多个响应消息,但我只投递一个WSA_RECV,那么是不是我只能收到一个响应?
如果我在WSA_RECV完成后再投递一个新的WSA_RECV,是否可能在这个期间内丢失响应消息?

if(OperationType==WSA_RECV)
{
//do something,这个时候如果服务器发回响应,是否就丢失了?
}
//投递一个新的WSA_RECV
...全文
186 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
visualwind 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 itsgoodtobebad 的回复:]

高手,再请教一个问题:

如果我在投递WSA_RECV的时候指定BUFFER长度,比如为64个字节,而实际上可以接收的数据不只64个字节
那么我可以不可以每次64个字节这样一直投递WSA_RECV,接收完所有的数据?
[/Quote]

可以,不过要注意GetQueuedCompletionStatus的lpNumberOfBytes参数,是实际接收的数据长度。
白虹李李 2010-10-19
  • 打赏
  • 举报
回复
高手,再请教一个问题:

如果我在投递WSA_RECV的时候指定BUFFER长度,比如为64个字节,而实际上可以接收的数据不只64个字节
那么我可以不可以每次64个字节这样一直投递WSA_RECV,接收完所有的数据?

visualwind 2010-10-19
  • 打赏
  • 举报
回复
其实已开始就应该投递WSA_RECV,这样有数据到达时GetQueuedCompletionStatus就会返回。并且接收完成后要继续投递WSA_RECV。
虽然只投递一个WSA_RECV,但如果一次性收完的话就可以,如果没收完,会在下一轮中接着收。
不会在这个期间内丢失响应消息。会在下一轮中接着收。

18,363

社区成员

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

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