完成端口 
在I/O服务线程中,通过WSARecv接收数据。在本机测试接收一切正常。
如果通过局域网中的另一台电脑发送数据,WSARecv则接收不了正常的数据。
如果在WSARecv前 添加一句sleep(1000)。则不论通过那种方式发送接收,都能正常接收数据。请问一下这是什么问题呢??
小弟刚接触IOCP 有很多不明白的地方,望各位老大能解惑

解决方案 »

  1.   

    说得不是很详细,初步估计overlapped结构是否重用了??
      

  2.   


    如果是粘包问题,那怎么在同一台电脑上发送和接收数据做测试的时候正常?
    而且不在同一台电脑上发送和接收数据的时候,能接收到数据,只是接收的数据不完整.比如:
    在一台电脑上发送了一个数组stemp[20],在另一台电脑上只接收到这个数组的前4项
    stemp[1]、stemp[2]、stemp[3]、stemp[4]。后面的项都没接收到那位老大帮帮小弟呀,小弟快被这个问题憋死了
      

  3.   

    你发送包是不是很大哟? 还有就是不是多线程同时操作一个SOCKET发数据了?
      

  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协议是可靠的到此结帖