Linux下Socket編程學習(三)

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章