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

设计步骤

分析数据特征

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

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

直到遇到FF则获得一个包

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

继续遍历。

 

一开始我使用的递归算法

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

 

最终代码如下

        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;
                }
            }
        }

 

 

但是,就这么一简单的程序,我来来回回折腾了不下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.为什么调试变得困难,我应该嗅出项目应该做出一些调整了。
 

转载于:https://www.cnblogs.com/edline/p/3632572.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值