主题:网络编程分离如何接收数据包
myjianghe
[专家分:470] 发布于 2009-02-02 15:42:00
我在SOCKET 编程时遇到这样的问题,就是在接收数据包不知道如何分离2个联系的消息。
如recv(s, recvbuf, 1024, 0);在recvbuf里存放的是接收的数据,但如果由于网络的原因使得
2个消息连在了一起,那么如何分离他们呢?
回复列表 (共3个回复)
沙发
abzhang [专家分:550] 发布于 2009-02-03 11:54:00
你发两次不就OK了.?
板凳
星绽紫辉 [专家分:1700] 发布于 2009-02-03 12:10:00
你所说的问题即由于网络原因所造成的“断帧”问题,对于2个或多个数据包,你可能想顺次发送,而且你发送的字节数可能不相等,由于TCP协议能够保证按次序接收,所以不必担心次序问题,但是到应用层,你接收的可能不是一个完整的数据包,而是过个包或者片段,这和你所定义的接受方式和采用的网络模型有一定的关系。
解决方案:
定义一个通用的数据包结构struct,并且必须满足结构的字节对齐(否则,在接受后另一端解析数据可能出错)。在通信中,始终以自定义的结构形式发送数据包。尽管如此,还是可能出现断帧,因此,你可以设定缓冲区为该通信结构体的大小的整数倍,并且检查实际读取的数据的大小,如果缓冲区没满,你继续读取,知道缓冲区满了,处理数据,然后清空缓冲区继续下一次的读取。当然,你也可以自己定制缓冲区大小为任意值,只要保证能够解析你自己的协议包就行。实际应用中,你可以设定一个指针记录缓冲区已存数据的位置,然后判断是否可以处理数据了。
3 楼
myjianghe [专家分:470] 发布于 2009-02-03 14:34:00
谢谢啊,我知道了。
我来回复