当前位置: 代码迷 >> VC/MFC >> 为何这种情况下会recv会出错
  详细解决方案

为何这种情况下会recv会出错

热度:159   发布时间:2016-05-02 03:23:17.0
为什么这种情况下会recv会出错?
我用的是TCP协议,在客户端和服务器之间传输数据时,我是这样的:每块数据都有一个数据头,数据头中定义了该数据的长度。然后接着才是真正的数据块。

然后在发送的时候,我是这样的:发送端用两次send函数来发送,一次发送数据头,一次发送真正的数据。接收端也用两次recv来接收。一次接收数据头,数据头收到以后,根据其中给出的长度,再进行第二次recv,接收的长度就是数据头中给出的长度。

可是我发现:这样子的话,会出错。第二次recv收不到数据。

如果发送的时候,把两块数据放在一起,用一次send发送。发现接收端两次recv就能正确收到。或者发送的时候虽分两次send发送。但接收的时候,只用一次recv(当然我预先知道总的长度),也可以把全部数据(包括数据头和数据体)全部收到。

这是怎么回事呢?不管接收端是阻塞方式还是非阻塞方式,好象均如此。

------解决思路----------------------
不管你是一次发送还是2次发送  你都应该判断send的返回值  那才代表你真正保存到缓冲区的数据是多少  像你说的这种情况 你分2次send 也许第二次send已经失败了  所以你不管几次recv都收不完数据(因为你第二次的数据根本就没发送成功) recv同理

ps: send返回失败 可以根据getlasterror判断错误  一般都是发送太快 你就需要中间sleep下
  相关解决方案