Socket 封包與拆包入門程式示例

2021-08-17 08:15:36 字數 1679 閱讀 6329

socket開發應解決的兩個基本問題:

1)client 與 server的連線通訊,可參考

「mfc/socket網路程式設計:

[1]伺服器

mfc/socket網路程式設計

:[1]客戶端

2)資料的封包與拆包,下面將部分關鍵**摘出,自己仔細把邏輯理通,相信很快能寫自己的封包與拆包程式。

封包**:

bool tcpserver::senddata( unsigned short nopcode, const char* pdatabuffer, const unsigned int& ndatasize )

// 傳送訊息

const unsigned short nsendsize = ndatasize + sizeof(netpacketheader);

phead->wdatasize = nsendsize;

int ret = ::send(macceptsocket, m_cbsendbuf, nsendsize, 0);

return (ret > 0) ? true : false;

}

拆包**:

void tcpclient::run()

// 儲存已經接收資料的大小

m_nrecvsize += nrecvsize; //m_nrecvsize 在run之前已經初始化為0,這只是部分**,重點看邏輯

// 接收到的資料夠不夠乙個包頭的長度

while (m_nrecvsize >= sizeof(netpacketheader))

// 讀取包頭

netpacketheader* phead = (netpacketheader*) (m_cbrecvbuf); //此處解讀包頭與寫入包頭的方式一致

const unsigned short npacketsize = phead->wdatasize;

// 判斷是否已接收到足夠乙個完整包的資料

if (m_nrecvsize < npacketsize)

// 拷貝到資料快取

copymemory(m_cbdatabuf, m_cbrecvbuf, npacketsize);

// 從接收快取移除

movememory(m_cbrecvbuf, m_cbrecvbuf+npacketsize, m_nrecvsize);

m_nrecvsize -= npacketsize;

// 解密資料,以下省略一萬字

// ...

// 分派資料報,讓應用層進行邏輯處理

phead = (netpacketheader*) (m_cbdatabuf);

const unsigned short ndatasize = npacketsize - (unsigned short)sizeof(netpacketheader);

onnetmessage(phead->wopcode, m_cbdatabuf+sizeof(netpacketheader), ndatasize);

++ncount;}}

std::cout << "已經和伺服器斷開連線!" << std::endl;

}

上面只是摘出了部分**,可仔細閱讀整個工程,很適合入門,建議仔細閱讀。源**鏈結如下:

Socket開發探秘 資料封包和拆包

在上篇 socket開發探秘 基類及公共類的定義 中介紹過,所有受到的資料報,經過系統的預處理後,都會得到乙個predata的資料實體,該實體包含了協議頭 協議內容和所屬使用者的id。predata是定義了乙個標準的協議資料格式,包含了協議關鍵字 協議內容 使用者標識的內容。前面說了,我們資料是通過...

C C 筆記三 tcp拆包與封包

tcp封包是 長度 2位元組 資料體,其中長度包含了這2個位元組,所以再解包的時候需要把這2位元組長度資訊去掉 unsigned char tcp protocol package const unsigned char raw data,int len,int pkg len 所以再解包的時候需要...

node 第七章TCP通訊的拆包與封包

1 在通訊的過程中,我們可能有傳送多個資料報,資料報a,資料報b,資料報c,此時我們最好的期望是每次收到資料報a,資料報b,資料報c。但是tcp底層為了傳送效能,可能會一次把abc所有資料一起傳過來,這個時候收到的是a b c,這個時候上層傻眼了,無法區分a,b,c這個叫做 粘包 1 要解決abc資...