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
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),几乎不影响应用程序的正常工作。