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; //讀到的字節數
}