TCP 組包和拆包演算法

2021-07-10 22:56:47 字數 1938 閱讀 5979

/*************************************

檔名: server.c

tcp 組包和拆包實現演算法

email: [email protected]

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#define buf_size 1024*5

//#define tcp_pack_debug 1

int main()

printf("socket ok !\r\n");

/* 填充伺服器埠位址資訊,以便下面使用此位址和埠監聽 */

bzero(&s_add,sizeof(struct sockaddr_in));

s_add.sin_family=af_inet;

s_add.sin_addr.s_addr=htonl(inaddr_any); /* 這裡位址使用全0,即所有 */

s_add.sin_port=htons(portnum);

/* 使用bind進行繫結埠 */

if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))

printf("bind ok !\r\n");

/* 開始監聽相應的埠 */

if(-1 == listen(sfp,5))

printf("listen ok\r\n");

//  while(1)

printf("accept ok!\r\nserver start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));

/* 這裡使用write向客戶端傳送資訊,也可以嘗試使用其他函式實現 */

if(-1 == write(nfp,"hello,welcome to my server \r\n",32))

//頭0xf9   兩個長度位元組   資料   尾0xf8

while(1)

#endif

if(bufsize>nbufuselen)

#endif

/*printf(" nrevoncelen data:\n");

for(i=0; i3)            //用到的大於3個位元組

#endif

if((buf[npacklen-1]&0xff)==0xf8)                  //尾

#endif

for(i=0; inbufuselen=nbufuselen-npacklen;      //用到的位元組變小了

//   continue;           //不要read了

}else

printf(" \n");

#endif

printf(" (buf[npacklen-1]&0xff)!=0xf8 \n");

nbufuselen=0;           //清除錯誤的包   //這裡應該不會執行

break;}}

else

}else}/*

if((0xff&buf[0])!=0xf2)

if(readlen!=1027)

printf("readlen = %d buf  0x%x  0x%x  0x%x \n",readlen,0xff&buf[0],0xff&buf[1],0xff&buf[2]);*/}

//  close(nfp);

}// close(sfp);

return 0;

}

TCP粘包和拆包

當傳送包同時傳送兩個資料報時,接收包只收到了乙個資料報,其中包含了兩個資料報的資訊,這種現象為粘包。這種情況下,接收方無法分清兩個資料報的界限,很難處理 當傳送包同時傳送兩個資料報時,接收方也收到了兩個資料報。但是這兩個資料報,乙個是不完整的,乙個是多出來一塊,這種現象為拆包。訊息定長 傳送方將資料...

TCP粘包 拆包

tcp粘包 拆包 客戶端發服務端傳送了兩個資料報a和b 粘包 服務端一次性接收到了a和b 拆包 服務端第一次接收了a和b的一部分,第二次接收到了b的剩餘部分 粘包 拆包原因 1 應用程式寫入的位元組大小 socket傳送緩衝區大小 2 tcp分段 tcp data部分的大小 mss max segm...

TCP粘包,拆包

粘包 拆包表現形式 現在假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到的資料可以分為三種,現列舉如下 第一種情況,接收端正常收到兩個資料報,即沒有發生拆包和粘包的現象,此種情況不在本文的討論範圍內。第二種情況,接收端只收到乙個資料報,由於tcp是不會出...