http://topic.csdn.net/t/20050119/12/3737501.html
-----------------------------------------------------------------------------
在一个连接上,我投递一个WSASend发送1K的数据出去,这时候下面的缓冲区里却只剩下512字节的空间,这时候,内核就会把这1K数据里的512字节拷贝到缓冲区里发出去,然后在GetQueueCompleteStatus里返回TRUE,并且在参数里指明只发送了512字节,这时候我们需要继续发送剩下的512字节才能保证把整个1K的数据发送完成,如果在GetQueueCompleteStatus返回后,我们继续发送剩下的512字节的这一个间隙,,刚好另外一个线程投递了一个WSASend发送1K的数据,而这时候下面的缓冲区空了,这1K的数据将被完全发送出去,然后内核才调度到我们继续发送剩下的512字节的这个线程,那么在客户端收到的数据就成了这样:
512字节+1K字节+512字节,而实际上我们希望客户端收到的数据是:
1K(第一次发送的)+1K(第二次WSASend)发送的。
同样,如果多次在一个连接上调用WSARecv,也会出现数据错乱的问题。
使用异步IO的时候,最好能保证上一个IO彻底完成后才继续发出下一个IO。
-----------------------------------------------------------------------------
显然如果需要一次性投递多个请求,那么就要设计一种很好的机制避免这样的问题。问题就在于这个机制的开销会不会比单一投递来的大,那这样的话,多次投递的好处就没有了。不知道哪位做过或者考虑过的朋友谈谈看。
这里有一个例子,他就是允许多个投递的:
网址:http://www.lenholgate.com/
代码:http://www.lenholgate.com/archives/zips/SocketServers-LatestRelease.zip