/*************************************
檔名: 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是不會出...