+ -
当前位置:首页 → 问答吧 → windows-IOCP同时发多个WSARecv 接受的数据会不会乱?懂的来

windows-IOCP同时发多个WSARecv 接受的数据会不会乱?懂的来

时间:2011-12-22

来源:互联网

比如客户端要发送的数据是:"1234567890abcdefghij**********"  

[客户端]
分成三个组包通过TCP发给iocp服务器,包发送顺序是:"包头1+123456789" "包头2+abcdefghij" "包头3+**********"

[IOCP服务器]
我每个WSARecv的缓存接受长度是:包头加10个长 ,
要接受这组数据必须同时发送三个WSARecv并创建三个缓存顺序:缓存1,缓存2,缓存3

问题一: (情况1)缓存1因其它原因数据未接受完,只收到"包头1+123" 还有"4567890"没收到,需要继续接受.
  这个时候,缓存2会不会把剩下"4567890"接受完并且还能接受一部分包头2的的数据?

问题二:(情况2)缓存1接受的是包头3的数据,缓存2接受的是包头1的数据,缓存3接受包头2数据. 这种情况会发生嘛?
  (当然这种情况可根据包头判断顺序)

问题三:一般造成缓存未接受完指定长度数据是什么原因造成的呢?

如果哪里不对,也可以发表你自己的看法

作者: xwzj264   发布时间: 2011-12-22

你这么短的数据不会引起二三四层重新分包的,所以不会乱的,若是打包后超出了TCP包的长度才存在拆包的可能。

在CSMA/CD中,一接是一个包的,当然这个是指底层的包的。

作者: yanyuchonglou   发布时间: 2011-12-22

问题一:有可能,但也可能缓存2没能完整地接收到10个字节的长度,而又是一部分。它的机制就是这样,实际接收长度 <= 缓存大小。

问题二:这里你描述不太清楚,是包头没对上包体吗?还是说缓存1没有收到包1,顺序乱了?
如果是前一种,这种情况不会发生,head与body不会错乱,TCP本身是保序的。
如果是后一种,那是有可能的,IOCP是排队的,就看哪个WSARecv请求先入队,先入队的先收数据,在多线程的情况下,系统机制很难保证你不错序,只能靠你自己重新排序。特别是,一般等待完成通知都是多个线程同时等,即使一先一后等来了两个完成通知,你也难以判断到底是哪个通知先到的,都是多线程的问题啦。

问题三:这个就很复杂了,不是完成端口的问题,而是TCP协议栈和物理网络问题了,总之记住一点,TCP系统协议栈只能保证数据像流水一样被发送接收,作为接收端你不应该去猜度发送端的片段大小。

作者: d00107916   发布时间: 2011-12-22

问题一:只要你的数据是发送成功的,服务器都能接收完整,只是要多次接收而已

问题二:会发生

问题三:这个问题比较复杂,应该跟底层的协议有关,所以发送数据得进行封装,接收数据得根据封闭的数据长度进行循环接收

作者: fishion   发布时间: 2011-12-22