網絡數據的打包(pack)

 http://bbs.csai.cn/bbs/view.asp?id=%7B7D79B044-B471-4E15-B837-88196EEFDC15%7D
在socket編程的時候,數據的傳輸一般都經過封裝打包才發送到另一端。打包一般都是加入一些額外的信息到raw data中,比如包頭一般都加入raw data的前面。包頭的大小一般都是比較小的(一般爲四字節大小),下面舉一個例子,來看看raw data是怎麼打包的:
/*
*下面這個例子1數據是沒有經過壓縮的,只是把原始的數據直接打包而已。
*/
template<typename buffer_type>
unsinged int packetData(const void *pData, const unsigned int nLen, buffer_type &cmd_queue)
{
unsigned int nSize = nLen > MAX_DATASIZE ? MAX_DATASIZE : nLen;
unsigned int nMask = 0;
cmd_queue.wr_reserve(nSize + PH_LEN);
bcopy(pData, &(cmd_queue.wr_buf()[PH_LEN]), nSize);
(*(unsigned int *)cmd_queue.wr_buf()) = (nSize | nMask);//包頭用來存儲原始數據的大小
cmd_queue.wr_flip(nSize + PH_LEN);
return nSize + PH_LEN;
}
/*
*下面的例子數據經過壓縮的。
*/
template<typename buffer_type>
unsinged int packetDataZip(const void *pData, const unsigned int nLen, buffer_type &cmd_queue, const bool _compress)
{
unsigned int nSize = nLen > MAX_DATASIZE ? MAX_DATASIZE : nLen;
unsigned int nMask = 0;
if(nSize >= PACKET_ZIP_MIN && _compress)
{
uncompress_size += nSize;
uLong nZipLen = unzip_size(nSize);
cmd_queue.wr_reserve(nZipLen + PH_LEN);
int retcode  = compress2_ze(&(cmd_queue.wr_buf()[PH_LEN]), &nZipLen, (const Bytef *)pData, nSize);//compress2_ze(Bytef *dest, uLongf *destLen, const Bytef *source, unsinged long sourceLen, int level);
switch(retcode)
{
//錯誤處理
}
nSize = nSizeLen;
compressed_size += nSize;
nMask |= PACKET_ZIP;
}
else
{
nocompress_size += nSize;
cmd_queue.wr_reserve(nSize + PH_LEN);
bcopy(pData, &(cmd_queue.wr_buf()[PH_LEN]), nSize);
}
(*(unsigned int *)cmd_queue.wr_buf()) = (nSize | nMask);//包頭用來存儲原始數據的大小
cmd_queue.wr_flip(nSize + PH_LEN);
return nSize + PH_LEN;
}
備註1:buffer_type是緩衝隊列類型,其定義以及操作在另外一編技術文章中。其中PH_LEN是包頭的大小,其定義爲:#define PH_LEN  (sizeof(unsigned int))。參數nLen是要打包的原始長度。在這裏,我向提一下一個c語言的基本知識點:在理解指針的時候,應該記住內存並不包含任何與之相關聯的內在的解析,只有通過使用一個特定類型的指針拿一個特殊位置的比特才能解析爲有意義的數據。
備註2:unzip_size在另外一編技術文章中有介紹
發佈了25 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章