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