tcp接收策略

2021-08-04 20:42:48 字數 1993 閱讀 9590

1. 首先,接收乙個長度。然後,根據長度再繼續接收資料。(感覺要好一點)

2. 直接接收所有,再判斷長度

最近在調程式的時候,發現傳送端傳送乙個119136個char的記憶體的時候,在接收端不能全部接收,

於是,通過除錯發現,必須在接收端多次的recv以後,進行拼接:

**如下:

char lenbuf[4];

int ilen; 

//接收資料

int bytes;

//先接受前面的四位訊息體長度

if((bytes=recv(clientsocket,lenbuf,sizeof(lenbuf),0))==socket_error)

else }

//這個長度包含了前面接收的4個byte的長度

//用於放內容的長度

memcpy( &ilen, lenbuf, sizeof(ilen) );

char *buf=(char *)malloc((ilen+1)*sizeof(char));

//第二次接收的話,就從下面的buf開始了,已經拋掉了buf長度的

//如果資料報很大的話,需要多次recv

int irecv =0;

if((bytes=recv(clientsocket,buf,(ilen+1),0))==socket_error)

else

else}}

在每個 報頭上說明包體的長度,這樣通過報頭大小來獲取相應的資料大小;
在此主要討論解決方法3,在報頭說明包體大小的方式
在此方式中,每個包都分為兩部分,第一部分為資料部分的大小,緊接的部分是資料部分,可以用結構體實現
struct packet
這樣資料在傳送的過程中將報頭和包體全部傳送,在接收的時候先接收4位元組的包頭資料
int a;
recv(sockfd,&a,4,0);
或者recv(sockfd,buff,maxsize,0);//線將緩衝區資料全部拿出來再處理
strncpy(&a,buff,4);
這樣就可以獲取包體資料大小,然後通過報頭大小獲取包體資料來解決粘包

**:粘包解決方案二:使用結構體,顯式說明資料部分的長度

在這個方案中,我們需要定義乙個『struct packet』包結構,結構中指明資料部分的長度,用四個位元組來表示。傳送端的對等方接收報文時,先讀取前四個位元組,獲取資料的長度,由長度來進行資料的讀取。定義乙個結構體

struct

packet

讀寫過程如下所示,這裡抽取關鍵**進行說明:

//傳送資料過程

struct packet writebuf;

memset(&writebuf,0,sizeof(writebuf));

while(fgets(writebuf.data,sizeof(writebuf.data),stdin)!=null)

下面是讀取資料的過程,先讀取msglen欄位,該欄位指示了有效資料data的長度。依據該字段再讀出data。

memset(&readbuf,0,sizeof(readbuf));

int ret = readn(conn,&readbuf.msglen,4); //先讀取四個位元組,確定後續資料的長度

if(ret == -1)

else

if(ret == 0)

int databytes = ntohl(readbuf.msglen); //位元組序的轉換

int readbytes = readn(conn,readbuf.data,databytes); //讀取出後續的資料

if(readbytes == 0)

if(readbytes<0)

TCP傳輸策略

基於tcp的各類解決方案,可以根據資料吞吐量來大致分成兩大類 1 互動資料型別,例如telnet,ssh,這種型別的協議在大多數情況下只是做小流量的資料交換,比如說按一下鍵盤,回顯一些文字等等。2 資料成塊型別,例如ftp,這種型別的協議要求tcp能盡量的運載資料,把資料的吞吐量做到最大,並盡可能的...

TCP接收檔案隨筆

tcp接收檔案隨筆 由於接收不及時,導致tcp接收快取區黏包,我需要對接收到的資料進行拆包,當然這需要我們傳送的資料報 包含 包頭 資料型別 負載長度 負載 包尾 校驗碼 最簡單的一包資料就這樣形成。我們對接收到的資料buffer進行遍歷,分包,最好先做乙個狀態機,方便自己清晰的注意到處於資料報的哪...

TCP資料接收處理方法

tcp作為流式傳輸協議,只能保證傳送和接收的資料,順序是一致的,而無法保證send和recv時返回的長度是一致的,send的資料有可能是多條資料的合併,也可能是大資料的分包,那麼如何解決這個問題?通常建議通過約定協議解決,比如增加頭,頭里帶上資料長度,接收方通過資料長度來讀對應的資料。寫個簡單的偽 ...