如题,这是我在写网络数据接收的时候想到的,在tcp/ip协议中,经常出现“粘包”的情况,就是前一个数据包的包尾同后一个数据包的包头一起接受到,需要把他们从缓冲区中取出。实际上就是给定一个应用层协议,比如
{
pkghead char;
pkglen  int;
pkgdata char[100];
pkgend  char;
}
要求从一段缓冲区中将该包取出。如何能通用的实现这个功能?比如每个程序的包结构都不同,或者同时需要识别多个协议。有没有通用的算法?谢谢!

解决方案 »

  1.   

    有这么复杂的应用吗?
    {
    pkghead char;
    pkgtype enum;
    pkglen int;
    pkgdata char[4]; //其实是一个指针,应用时可以扩展到几个结构
    pkgend char;
    }
      

  2.   


    同时需要识别多个协议.那么你的包头中第一个字节可以设置为协议类型,
    从SOCKET中读取一个字节,判断出协议类型,
    有了协议类型,那么包头长度也就有了,假设为N,
    接下来读取N-1个字节,整个包头就有了,包头中应该有
    有效载荷数据长度吧,假设为M,再读取M个字节,这样一个
    完整包就有了,剩下的就循环吧。