1.用recv或者WSARecvFrom接收数据的时候,有时候会得到不完整的数据。用了Sleep函数后就正常了。这个是什么原因呢?是否可以通过不断的Recv来接收,直到recv返回的0为止?
2.就是我对套接字这个具体的模型不是很清楚,比如说我对服务器send了一个命令,服务器这个时候会返回一些数据A,但是我并不接收这些数据A,我又发送了另外一个命令给服务器,服务器这个时候应该会返回数据B。那么在此之后我在WSARecvFrom来接收的话,是直接得到B呢,还是先得到A再可以得到B,或者可能有些数据丢失了,得到了A还有B的一部分?
麻烦各位了
2.就是我对套接字这个具体的模型不是很清楚,比如说我对服务器send了一个命令,服务器这个时候会返回一些数据A,但是我并不接收这些数据A,我又发送了另外一个命令给服务器,服务器这个时候应该会返回数据B。那么在此之后我在WSARecvFrom来接收的话,是直接得到B呢,还是先得到A再可以得到B,或者可能有些数据丢失了,得到了A还有B的一部分?
麻烦各位了
2 如果用WSARecvFrom的话,可能是A,也可能是B,但是不会是A还有B的一部分
本质上各个函数都是对一些操作的封装,有些函数实现的功能多一些,有些少一些。
网络的数据有快有慢,数据包也有大有小,套接字的缓存设置不可能无限的大,不能
保证一次性可以将发送过来的数据全部接收,send,recv函数有个WSAEWOULDBLOCK的返回
错误,表示当前发送缓冲区已满(或已空),需要等到清空缓冲区才能继续讲send,recv函数
将数据拷出拷入缓冲区。
这其实是一个同步问题,就好像有一个杯子(缓冲区),只有在杯子里倒了水(send),杯子里才有水喝(recv),
当倒水(send)的速度快,喝水慢(recv),就会出现杯子水满的情况,这时,就需要等待(sleep)。
反过来一样。
2.有可能得到A,也有可能得到B,因为存在网络延迟的原因。但不可能得到了A还有B的一部分,因为TCP协议是可靠的。