完成端口
在I/O服务线程中,通过WSARecv接收数据。在本机测试接收一切正常。
如果通过局域网中的另一台电脑发送数据,WSARecv则接收不了正常的数据。
如果在WSARecv前 添加一句sleep(1000)。则不论通过那种方式发送接收,都能正常接收数据。请问一下这是什么问题呢??
小弟刚接触IOCP 有很多不明白的地方,望各位老大能解惑
在I/O服务线程中,通过WSARecv接收数据。在本机测试接收一切正常。
如果通过局域网中的另一台电脑发送数据,WSARecv则接收不了正常的数据。
如果在WSARecv前 添加一句sleep(1000)。则不论通过那种方式发送接收,都能正常接收数据。请问一下这是什么问题呢??
小弟刚接触IOCP 有很多不明白的地方,望各位老大能解惑
如果是粘包问题,那怎么在同一台电脑上发送和接收数据做测试的时候正常?
而且不在同一台电脑上发送和接收数据的时候,能接收到数据,只是接收的数据不完整.比如:
在一台电脑上发送了一个数组stemp[20],在另一台电脑上只接收到这个数组的前4项
stemp[1]、stemp[2]、stemp[3]、stemp[4]。后面的项都没接收到那位老大帮帮小弟呀,小弟快被这个问题憋死了
1.用recv或者WSARecvFrom接收数据的时候,有时候会得到不完整的数据。用了Sleep函数后就正常了。这个是什么原因呢?是否可以通过不断的Recv来接收,直到recv返回的0为止?
2.就是我对套接字这个具体的模型不是很清楚,比如说我对服务器send了一个命令,服务器这个时候会返回一些数据A,但是我并不接收这些数据A,我又发送了另外一个命令给服务器,服务器这个时候应该会返回数据B。那么在此之后我在WSARecvFrom来接收的话,是直接得到B呢,还是先得到A再可以得到B,或者可能有些数据丢失了,得到了A还有B的一部分?
麻烦各位了答:
1.TCP发送数据时,可能把同一个缓冲区的内容(也就是send函数里的缓冲区)分成几个TCP数据包发送出去,当你进行接收时可能只接收到一个TCP数据包,所以会得到不完整的数据。但当你sleep后,这个几个TCP包都已经到达,如果你recv的缓冲区足够大的话,就可以一次接收到了。建议用采用while循环或者异步模式。
2.有可能得到A,也有可能得到B,因为存在网络延迟的原因。但不可能得到了A还有B的一部分,因为TCP协议是可靠的到此结帖