关于recv接收数据的问题,总是接收buffer大小的数据
ACE::recv(handlers, buffer, size),服务端连续不断的发送数据来(数据长度可能不等),每次不等数据接收完后面的数据就会压进来,而recv每次都会copy buffer大小的数据,造成buffer里是上个没收完的数据和这个数据
比如每次发送500个字节,接收buffer为1024,发送5次,按理应该接到的大小是这样:
500
500
500
500
500
但是实际是这样:
1024
1024
452
如果数据大于buffer,比如1030,应该是:
1024
6
1024
6
1024
6
1024
6
1024
6
但是实际会是这样:
1024
1024
1024
1024
1024
30
这是怎么回事啊,是不是要设置什么东西,c里的recv好像也是这样
[解决办法]
TCP是流,没有边界。send发送和recv接收并不是一一对应的,可能send多次,recv一次就接收(当然recv的buffer足够大),也可能send一次,recv多次。
[解决办法]
把socket设置为非阻塞,然后循环recv到一个buffer,然后解析并且移动读指针。
因为一次recv可能收到半个包,1个包,或者1个半甚至多个包。
[解决办法]
如果要TCP应用层报文不粘在一起,只能使用应答机制,A发送1030字节,结果分成了1024+6两个报文,然后B收到1030字节后发个ACK,A在收到ACK后再发下一个报文。
不过这样TCP就没有速率上的优势了。
一般的做法就是上面说的缓冲。应用层报文分成两部分,头(Header)和数据。头的长度是固定的,内部包含数据部分的长度。
开始缓冲区的空的,程序不断接受数据,直到已收到的字节数超过Header的长度。这时就知道数据部分的长度了,继续接受数据直到第一个应用层报文完全收到。
然后把第一个应用层报文取出来,缓冲区中的其它数据向前移动n个字节(n是头的数据部分的总长度),准备接受下一个应用层报文。
[解决办法]
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
[解决办法]
楼主:一定要分包的话,在应用层分。每次发内容之前先发一个表示包大小的数字,客户端就读这么多字节。