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; //读到的字节数
}