TCP粘包,通常是指客户端无法正确的区分数据内容所存在的问题。


TCP自身本来就是面向流的协议,流就像河流中的水,本身是不存在单个的说法的。



char *buf="hello,I want an apple";
char *buf1="hello,I want an pear";
while(1)
{
        if(write(confd,buf,strlen(buf))==-1)
        {
                perror("write");
        }
        if(write(confd,buf1,strlen(buf1))==-1)
        {
                perror("write");
        }
}


比如这里我们连续不断的向客户端发送两条指令。

但是客户端接受到的确实这样的数据

,I want an applehello,I want an pearhello,I want an applehello,I want an pearhello,I want an applehello,I want an pearhello,I want an applehello


很显然客户端根本无法区分出需要执行的指令。


TCP粘包分析,及解决方法。_TCP

通过抓包可以看出,TCP是直到把缓冲区装满才发送一个包,这应该就是引起粘包的根本原因。



如何解决这个问题?那就想办法让客户端区分出我们的指令。

head.len=strlen(buf);
memcpy(packet,&head,sizeof(head));
memcpy(packet,buf,strlen(buf));
if(write(confd,packet,strlen(packet))==-1)
{
        perror("write");
}


可以在每个指令的前面再增加一个数据头,其中包含该指令数据的长度,这样客户收到数据流后就能正确的区分出各个指令了。