我所经历过的tcp“粘包”及其处理

来源:互联网 发布:python中tile函数 编辑:程序博客网 时间:2024/03/28 18:13

         刚毕业参加工作的时候, 我对计算机网络和网络编程一无所知。 当时要负责一个客户端界面软件的维护和开发, 而另一个“同事”要离职, 哎, 扯远了。

         我当时在代码中读到一个注释, 其中有“粘包”二字, 当时比较纳闷: 不都说tcp是好东西吗? 怎么会粘包呢? 可见, 我确实对网络一无所知。 后来, 我发现, 这个客户端居然真的能和服务端通信, 很显然啊, 不然也不会存在这么久。 于是, 我对网络编程有点兴趣了。

         试用期, 师傅叫我搞tcp客户端、服务端程序, udp客户端服务端程序, 我七拼八凑地搞了, 后来师傅在review我的代码时, 不断问我每个函数和参数的含义, 怎么调试。 总之, 问得我哑口无言, 一问三不知。 师傅看出了, 我是直接“参考”了网络上的程序, 而且没有搞懂。于是, 我下定决定搞网络编程, 哎,又扯远了, 跑题了。


         话说, 当时看到粘包, 不知道啥意思, 也没有仔细了解。 后来到了另外一家公司, 我偶然地被一个问题卡住了: 对端回包OK,  但我的程序解包失败。 我开始怀疑是不是buffer不够, 后来排除了这个原因。 这个问题必须要解决, 怎么办呢? 那就看封装的网络库的源码吧, 发现有个函数的指针为NULL了, 于是我就参考其他地方的调用方法, 对函数指针进行了赋值, 结果就OK了, 于是我记住了, 这里要赋值。

         后来, 我看到了tcp粘包, 就想了解一下, 原来, 当时的解包错误是因为粘包导致包切割的长度不对。 于是, 我就懂了, 为什么要对那个函数指针进行初始化, 因为这个函数指针对应函数就是用来检验包的完整性的, 这样可以解决粘包问题。

         

         最近呢? 某哥收到包后, 解包会失败, 后来证实发现, 也是粘包问题。

         最近又发现, 某同学手包低概率性失败, 经查, 是收到的时候, 没有进行包的完整性判断, 导致了粘包问题。

         后来, 另外一个某哥说, 他曾经写过一个程序, 没有进行粘包检测, 结果跑了很久没有问题, 后来终于出问题了, 呵呵哒。


         TCP粘包就是这么有意思。 至于Tcp的粘包原因和解决方法, 我之前已经说过了, 就不再赘述了。