我用的是TCP协议,在客户端和服务器之间传输数据时,我是这样的:每块数据都有一个数据头,数据头中定义了该数据的长度。然后接着才是真正的数据块。
然后在发送的时候,我是这样的:发送端用两次send函数来发送,一次发送数据头,一次发送真正的数据。接收端也用两次recv来接收。一次接收数据头,数据头收到以后,根据其中给出的长度,再进行第二次recv,接收的长度就是数据头中给出的长度。
可是我发现:这样子的话,会出错。第二次recv收不到数据。
如果发送的时候,把两块数据放在一起,用一次send发送。发现接收端两次recv就能正确收到。或者发送的时候虽分两次send发送。但接收的时候,只用一次recv(当然我预先知道总的长度),也可以把全部数据(包括数据头和数据体)全部收到。
这是怎么回事呢?不管接收端是阻塞方式还是非阻塞方式,好象均如此。
------解决思路----------------------
不管你是一次发送还是2次发送 你都应该判断send的返回值 那才代表你真正保存到缓冲区的数据是多少 像你说的这种情况 你分2次send 也许第二次send已经失败了 所以你不管几次recv都收不完数据(因为你第二次的数据根本就没发送成功) recv同理
ps: send返回失败 可以根据getlasterror判断错误 一般都是发送太快 你就需要中间sleep下