为什么这种情况下会recv会出错?
我用的是TCP协议,在客户端和服务器之间传输数据时,我是这样的:每块数据都有一个数据头,数据头中定义了该数据的长度。然后接着才是真正的数据块。
然后在发送的时候,我是这样的:发送端用两次send函数来发送,一次发送数据头,一次发送真正的数据。接收端也用两次recv来接收。一次接收数据头,数据头收到以后,根据其中给出的长度,再进行第二次recv,接收的长度就是数据头中给出的长度。
可是我发现:这样子的话,会出错。第二次recv收不到数据。
如果发送的时候,把两块数据放在一起,用一次send发送。发现接收端两次recv就能正确收到。或者发送的时候虽分两次send发送。但接收的时候,只用一次recv(当然我预先知道总的长度),也可以把全部数据(包括数据头和数据体)全部收到。
这是怎么回事呢?不管接收端是阻塞方式还是非阻塞方式,好象均如此。
然后在发送的时候,我是这样的:发送端用两次send函数来发送,一次发送数据头,一次发送真正的数据。接收端也用两次recv来接收。一次接收数据头,数据头收到以后,根据其中给出的长度,再进行第二次recv,接收的长度就是数据头中给出的长度。
可是我发现:这样子的话,会出错。第二次recv收不到数据。
如果发送的时候,把两块数据放在一起,用一次send发送。发现接收端两次recv就能正确收到。或者发送的时候虽分两次send发送。但接收的时候,只用一次recv(当然我预先知道总的长度),也可以把全部数据(包括数据头和数据体)全部收到。
这是怎么回事呢?不管接收端是阻塞方式还是非阻塞方式,好象均如此。
...全文
相关推荐
s7-300常见故障分析
西门子的常见故障分析。让你更加了解plc和更加更快的处理故障!
西门子 S7-300 PLC 从入门到精通的100个经典问题
西门子 S7-300 PLC 从入门到精通的100个经典问题
关于socket阻塞与非阻塞情况下的recv、send、read、write返回值.zip
关于socket阻塞与非阻塞情况下的recv、send、read、write返回值.zip
sms_recv.rar_oracle
CMPP2.0下的短信端口接受程序,将受到的短信查到后台的ORACLE数据库中。已经有点过时了,但是还可以参考一下吧。程序如果出错后会自动重启一个新的程序继续接受。
Socket send函数和recv函数详解
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。


网络编程
