1.用recv或者WSARecvFrom接收数据的时候,有时候会得到不完整的数据。用了Sleep函数后就正常了。这个是什么原因呢?是否可以通过不断的Recv来接收,直到recv返回的0为止?
2.就是我对套接字这个具体的模型不是很清楚,比如说我对服务器send了一个命令,服务器这个时候会返回一些数据A,但是我并不接收这些数据A,我又发送了另外一个命令给服务器,服务器这个时候应该会返回数据B。那么在此之后我在WSARecvFrom来接收的话,是直接得到B呢,还是先得到A再可以得到B,或者可能有些数据丢失了,得到了A还有B的一部分?
麻烦各位了

解决方案 »

  1.   

    1 recv 可能收到不完整的数据,但是WSARecvFrom应该不会
    2 如果用WSARecvFrom的话,可能是A,也可能是B,但是不会是A还有B的一部分
      

  2.   

    这个问题要从套接字实现的原理来看。
    本质上各个函数都是对一些操作的封装,有些函数实现的功能多一些,有些少一些。
    网络的数据有快有慢,数据包也有大有小,套接字的缓存设置不可能无限的大,不能
    保证一次性可以将发送过来的数据全部接收,send,recv函数有个WSAEWOULDBLOCK的返回
    错误,表示当前发送缓冲区已满(或已空),需要等到清空缓冲区才能继续讲send,recv函数
    将数据拷出拷入缓冲区。
    这其实是一个同步问题,就好像有一个杯子(缓冲区),只有在杯子里倒了水(send),杯子里才有水喝(recv),
    当倒水(send)的速度快,喝水慢(recv),就会出现杯子水满的情况,这时,就需要等待(sleep)。
    反过来一样。
      

  3.   

    第一个问题,如果是tcp的,可以不断recv接受完整.
      

  4.   

     recv在非阻塞模式下,用循环接收是比较好
      

  5.   

    1.TCP发送数据时,可能把同一个缓冲区的内容(也就是send函数里的缓冲区)分成几个TCP数据包发送出去,当你进行接收时可能只接收到一个TCP数据包,所以会得到不完整的数据。但当你sleep后,这个几个TCP包都已经到达,如果你recv的缓冲区足够大的话,就可以一次接收到了。建议用采用while循环或者异步模式。
    2.有可能得到A,也有可能得到B,因为存在网络延迟的原因。但不可能得到了A还有B的一部分,因为TCP协议是可靠的。