WEB开发网
开发学院软件开发VC 解决TCP网络传输“粘包”问题 阅读

解决TCP网络传输“粘包”问题

 2006-04-04 11:10:41 来源:WEB开发网   
核心提示: 2.实验硬件环境:服务器:pentium 350 微机客户机:pentium 166微机网络平台:由10兆共享式hub连接而成的局域网3.实验软件环境:操作系统:windows 98编程语言:visual c++ 5.04.主要线程编程采用多线程方式,服务器端共有两个线程:发送数据线程、发

2.实验硬件环境:

服务器:pentium 350 微机

客户机:pentium 166微机

网络平台:由10兆共享式hub连接而成的局域网

3.实验软件环境:

操作系统:windows 98

编程语言:visual c++ 5.0

4.主要线程

编程采用多线程方式,服务器端共有两个线程:发送数据线程、发送统计显示线程。客户端共有三个线程:接收数据线程、接收预处理粘包线程、接收统计显示线程。其中,发送和接收线程优先级设为thread_priority_time_critical(最高优先级),预处理线程优先级为thread_priority_above_normal(高于普通优先级),显示线程优先级为thread_priority_normal(普通优先级)。

实验发送数据的数据结构如图5所示:

图5

5.分包算法

针对三种不同的粘包现象,分包算法分别采取了相应的解决办法。其基本思路是首先将待处理的接收数据流(长度设为m)强行转换成预定的结构数据形式,并从中取出结构数据长度字段,即图5中的n,而后根据n计算得到第一包数据长度。

1)若n<m,则表明数据流包含多包数据,从其头部截取n个字节存入临时缓冲区,剩余部分数据依此继续循环处理,直至结束。

2)若n=m,则表明数据流内容恰好是一完整结构数据,直接将其存入临时缓冲区即可。

3)若n>m,则表明数据流内容尚不够构成一完整结构数据,需留待与下一包数据合并后再行处理。

对分包算法具体内容及软件实现有兴趣者,可与作者联系。

四、实验结果分析

实验结果如下:

1.在上述实验环境下,当发送方连续发送的若干包数据长度之和小于1500b时,常会出现粘包现象,接收方经预处理线程处理后能正确解开粘在一起的包。若程序中设置了“发送不延迟”:(setsockopt (socket_name,ipproto_tcp,tcp_nodelay,(char *) &on,sizeof on) ,其中on=1),则不存在粘包现象。

2.当发送数据为每包1kb~2kb的不定长数据时,若发送间隔时间小于10ms,偶尔会出现粘包,接收方经预处理线程处理后能正确解开粘在一起的包。

3.为测定处理粘包的时间,发送方依次循环发送长度为1.5kb、1.9kb、1.2kb、1.6kb、1.0kb数据,共计1000包。为制造粘包现象,接收线程每次接收前都等待10ms,接收缓冲区设为5000b,结果接收方收到526包数据,其中长度为5000b的有175包。经预处理线程处理可得到1000包正确数据,粘包处理总时间小于1ms。

实验结果表明,TCP粘包现象确实存在,但可通过接收方的预处理予以解决,而且处理时间非常短(实验中1000包数据总共处理时间不到1ms),几乎不影响应用程序的正常工作。

上一页  1 2 3 4 

Tags:解决 TCP 网络传输

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接