1、流协议与粘包
2、粘包产生的原因
3、粘包处理方案
4、readn writen
TCP 是流协议没有边界容易产生粘包。
解决方案:
1、定长包
2、包尾加\r\n(ftp) 有一定问题 消息本身具有\r\n就无法区分边界
3、包头加上包体长度
4、更复杂的应用协议
解决TCP粘包问题,读取指定大小的数据
size_t readn(int fd,void *buf,size_t count)
{
size_t nleft = count; //剩余的字节数
size_t nread; //已经接收的字节数
char *bufp = (char*) buf;
while(nleft > 0)
{
if(nread = read(fd,bufp,nleft) <0)
{
if(error == ETINTR) //被信号中断了
{
continue;
}
return -1; //出错
}
else if(nread == 0)
return count-nleft; //对等方关闭
bufp += nread;
nleft -= nread;
}
return count; //读到的字节数
}发送指定大小的数据
size_t writen(int fd,const void *buf,size_t count)
{
size_t nleft = count; //剩余发送的字节数
size_t nwritten; //已经发送的字节数
char *bufp = (char*) buf;
while(nleft > 0)
{
if(nwritten = write(fd,bufp,nleft) <0)
{
if(error == ETINTR) //被信号中断了
{
continue;
}
return -1; //出错
}
else if(nwritten == 0)
continue;
bufp += nwritten;
nleft -= nwritten;
}
return count; //读到的字节数
}
本文探讨了TCP粘包现象及其产生的原因,并提出了多种解决方案,包括定长包、包尾加特殊字符、包头携带长度信息及应用协议设计。此外,还提供了readn和writen函数的具体实现来确保数据的准确收发。

被折叠的 条评论
为什么被折叠?



