首页 > 其他 > 详细

项目中解决粘包的一个小程序

时间:2014-03-29 19:12:29      阅读:514      评论:0      收藏:0      [点我收藏+]

设计步骤

分析数据特征

比如我的数据是7E开头FF结尾,在不需要很严格的校验手段时就是:

使用游标遍历整个流(BUF,内存)

直到遇到FF则获得一个包

通过拷贝,把此包添加到结果集中

继续遍历。

 

一开始我使用的递归算法

然后觉得不需要,继续遍历就好了

 

最终代码如下

bubuko.com,布布扣
        private void GetCompeletedPackage(byte[] buffer, int start, ref List<CommunicateData> result)
        {
            for (int i = start; i + 10 <=buffer.Length; i++)//两个F7F7结尾标志+8位标识符+两个7E开始符,长度比索引大1,所以是i+10
            {
                if (buffer[i] == 0xF7 && buffer[i + 1] == 0xF7 )
                {
                    byte[] data = new byte[i-start +10];
                    Array.Copy(buffer, start, data, 0, data.Length);
                    result.Add(new CommunicateData(data));
                    i = i+10;
                    start = start + data.Length;
                }
            }
        }
bubuko.com,布布扣

 

 

但是,就这么一简单的程序,我来来回回折腾了不下10次....

第一次没考虑好

多了这个判断 buffer[i+9] == 0x7E
结果如果没粘包的话就没能够添加进去

i-start+10这个也调试了3次以上才确定......

 i = i+10;调试了一次,起初是i=i+data.Length
start = start + data.Length;调试了一次,起初是start = i;

如果都能调试这些都很好办,
可惜我这个项目比较大,不能直接启动调试,只能附加release到进程看,
看到错误也不能直接修改出结果,要关掉了才能修改
这样的往返相当的劳神费力。

以下是我需要改进的地方:
1.设计前一定要想清楚遇到的问题还有细节
2.不要太靠调试,写完先检查代码又没有漏洞。
3.写完就调试
4.如果调试非常困难,则考虑单独去调试代码,即单元测试。这个方面我还不太了解...
5.为什么调试变得困难,我应该嗅出项目应该做出一些调整了。
 

项目中解决粘包的一个小程序,布布扣,bubuko.com

项目中解决粘包的一个小程序

原文:http://www.cnblogs.com/edline/p/3632572.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!