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是直到把缓冲区装满才发送一个包,这应该就是引起粘包的根本原因。
如何解决这个问题?那就想办法让客户端区分出我们的指令。
head.len=strlen(buf);memcpy(packet,&head,sizeof(head));memcpy(packet,buf,strlen(buf));if(write(confd,packet,strlen(packet))==-1){ perror("write");}
可以在每个指令的前面再增加一个数据头,其中包含该指令数据的长度,这样客户收到数据流后就能正确的区分出各个指令了。