作者:朱金灿
来源:http://blog.csdn.net/clever101
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
前段时间,维护一个网络程序。客户反映我们的系统有时接收不到来自任务管理系统的socket字符串,存在丢失数据的问题。我看了一下代码(代码是别人写的),发现系统的代码写得有问题。原来系统的代码是开辟一个大的接收缓冲区,试图一下把整个数据包接收过来。实际上接收网络数据包面临一个拆包的问题,可靠的拆包的方式应是进行分段接收,然后把数据拼接起来。如何分段接收,这里大有讲究,且容我结合我的排错经历细细道来。
开始我考虑的一种算法是:
开始循环接收数据,设定每次接收100个字节(我能确保数据包都大于100个字节),对下面各种情况进行判断:
a.如果实际接收字节数为0,直接退出.
b.如果实际接收字节数小于100,就可能有两种情况:
(1)如果是第一次接收,就退出
(2)如果是最后一次接收(比如包的大小为320,最后接收的20个字节),就把数据接收过来,并退出
c.如果实际接收字节数等于100,首先判断是否是第一次接收,若是解析出包的大小(判断包头的第八个字节),然后进行接收,若不是就直接接收.
3.循环进行进行第二步,直接接收完整个包。
我这样设计是基于我对TCP协议的理解。我以为TCP协议能保证我每次都能接收到100个字节。我这样修改系统之后用户依然反映存在丢失数据的问题。于是我判断最有可能的情况就是第一次就接收不到100个字节从而导致程序退出。为证实我这个判断,我采用把接收到字符串都写进日志文件的办法。通过分析日志文件证实了我的判断,在丢失数据的一种情况就是第一次只接收了63个字节。这促使我更深刻地理解了TCP协议的特点。我认为TCP协议具有以下特点(大家认为不正确欢迎指出):
1. 可靠性。就是甲给乙传300个字节,TCP协议能保证这300个字节一个不少地传给乙。
2. 流特性。你可以想象TCP协议下的网络转输就是一条河流。这条“河流”的“河水”不是平坦的,而是起伏不平的,具体就是说你在客户端开辟一个100个字节的接收缓冲区,每次你实际接收的字节数有可能是0到100。
3. 顺序性。TCP协议保证后面服务器端发给客户端的数据不会跑到前面发的数据去,所有接收数据的顺序都按照发送顺序来。
理解了TCP协议的特点,我重新设计了数据包拆包算法。一般数据包对应程序逻辑中的一个结构体,该结构体一般要定义一个数据包长度的成员变量(为保证数据包接收的完整性),而且要将该变量尽可能排在数据包前面。我把这个算法分为两步:
第一步解析数据包的长度
第二步根据数据包的长度接收数据
具体算法是:
第一步解析数据包的长度
在接收的时候,应该先指定接收8字节(假设包长度的变量所占的字节数为8),并判断返回值,如果实际接收到的数据不足8字节,应调整缓冲区指针,继续接收后面的数据,例如只收到2字节,应该将缓冲区指针加4,在执行接收,指定接收6字节,然后再判断返回值,重复上面步骤,直到收齐8字节为止。收齐8字节立即解析并保存起来。
第二步根据数据包的长度接收数据
1. 设定接收缓冲区为整个包的长度.
2.开始循环接收数据,
a.如果实际接收字节数为0,直接退出.
b.如果实际接收字节数不为0,就直接接收,同时将待接收数据长度(初始化为整个包的长度)减去本次实际接收的字节数。
3.循环进行进行第二步,直接接收完整个包(以待接收数据长度为0进行判断).
值得注意的是,在各次接收过程中,如果接收函数返回0,表示连接已断开,如果返回值为-1,表示出现了错误,应根据具体情况来做出响应的处理。
相关源码为:
在此非常感谢CSDN的cnzdgs大侠给我的指点!
分享到:
相关推荐
叫你如何调试排错,经典。 Windows 排错 调试 debug
这是一篇介绍Windows系统上User Mode程序的排错 (troubleshooting) 方法和技巧的文章。 无论是开发,测试还是支持,都会遇上程序运行结果跟预期效果不一致的情况。找到问题的根源和解决的过程,就是排错。同时,...
已知n个篮子一字排开(n为用户输入的任意正整数),从左到右分别标着号:1,2,... ...,n;每个球也有编号,分别也是1,2,... ...,n。现要将这n个球全部放入这n个篮子中,满足:每个篮子放置1个球,球的号不能...
明确地定义什么是网络的“故障”和“排错”不是一件容易的事情。网络的“故障”往往是用户在某种应用不能正常实现时感知到的,有的业务场合,要迅速地找到故障并加以排除的要求是相当严格的。除了设备在正常运行中...
实验七网络硬软件资源共享与TCPIP网络调试排错参照.pdf
熊力的Free版,程序排错教程,来自其blog
网络硬软件资源共享及网络调试排错.doc
网络排错专家 华为3COM培训胶片
Windows用户态程序高效排错
教程名称: 思科网络互联排错手册合集Internetworking Troubleshooting H【】Troubleshooting Dialup Connections【】Troubleshooting Ethernet【】Troubleshooting Frame Relay Connections【】Troubleshooting Ha...
计算机网络排错常用命令,经过我的使用,绝对是最全的!
Windows服务启动排错.pdf
发现网络规划和配置中欠佳之处,改善和优化网络的性能;观察网络的运行状况,及时预测网络通信质量。 网络故障诊断以网络原理、网络配置和网络运行的知识为基础。从故障现象出发,以网络诊断工具为手段获取诊断信息...
我准备安排一个华为资源大集合 依次包括 华为_模拟电路设计(上下合集) 华为_同步电路设计规范 华为排错专家教程 华为_H.248协议介绍 华为_PCB的EMC设计指南 华为_SDH光传输技术 华为_大规模逻辑设计指导书 华为_...
如何评估开源软件的可靠性是一个重要的问题,与传统的闭源软件相比,在建立开源软件可靠性模型时必须考虑故障引入和故障检测与排错之间的延迟时间这两个因素。考虑了排错过程和不完美调试现象,提出了相应的开源软件...
本书是一本介绍Windows系统上的用户态程序排错方法和技巧的书。本书分为4个章节,先介绍最重要的、通用的思考方法,以便制定排错步骤;再介绍对排错有帮助的知识点和工具;并介绍了.NET Framework(CLR)的相关知识...
非常详细的网络专业人士排错笔记 非常详细。 收集详细信息(Gather Facts)R>信息来源:关键用户、网络管理系统、路由器/交换机 1) 识别症状: 2) 重现故障:校验故障依然存在 3) 调查故障频率: 4) 确定...
Windows用户态程序高效排错。。