青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我的玻璃盒子

(轉載)一個struct結構,一次發送多個邏輯結構信息

原文:http://www.shnenglu.com/tonykee/archive/2008/01/24/41766.html

游戲里面的數據,最重要的就是如何組織,常見的包結構就是type+len+data這樣的結構
//所有包的基類型
struct BasePack
{
  unsigned short type;  //類型
  unsigned short len;   //長度
  BasePack();
  unsigned short size();
};
//////////////////////////////////////////////////////////////////////////
//比如這個是登錄包結構
struct LoginPack :public BasePack
{
  char username[15];
  char password[10];
  LoginPack();
  unsigned short size();
};
//..還有很多類型的包結構,自己去擴展
//下面這個包結構就很特別了:
這個struct 結構能保存變長的子結構體,也就是結構體的容器,如果一次要發送大量查詢的數據,可以用這個容器來裝載。結構大致如下:
//////////////////////////////////////////////////////////////////////////
//集合包,這是個很特殊的包,里面的數據是變長的(buffer 將作為子包的首指針)
//當然也有個上限,只不過和StringPack一樣,每次發送的數據量不固定,并不一定是包體的長度,
//使用這個包的注意事項:1.如果用tcp,總長不要超過4096, 如果用udp總長不要超過1024(安全指數)
//                      2.一般一個包不會共享給多個線程來處理,而且都是臨時拼發,并未考慮線程安全
struct CollectionPack:public BasePack
{
  unsigned short mSubPackCount;   //子包的數量

  char buffer[4096];           //最大限度的包長度,做緩沖

  CollectionPack();

  //清除CollectionPack里面的內容
  void clear();

  //得到子包的數量
  unsigned short getSubpackCount();

  //添加子包,添加是否成功,集合包的大小,默認不超過MTU的大小,當然如果是TCP傳輸,則沒有這個限制,最大可以是4096
  bool   append(BasePack &pack,  unsigned short  maxsize=1500);

  //本集合包的總長度
  unsigned short size();

  //重載數組運算符,這樣就可以數組迭代的方式訪問子包了,不過用索引迭代沒有next迭代的效率高
  BasePack *operator[](int idx);

  //p迭代的指針,返回當前取出來的包的指針使用方法如下:
  //   BasePack *p = 0;
  //while(collection.next(&p))
  //{
  //  p就是當前你找到的包了
  //}
  BasePack * next(BasePack ** p);
};
CollectionPack::CollectionPack()
{
memset(buffer,0, 4096);
type = COLLECTION_PACK;
mSubPackCount = 0;
}

//清除CollectionPack里面的內容
void CollectionPack::clear()
{
mSubPackCount = 0;
memset(buffer,0, 4096);
}

//得到子包的數量
unsigned short CollectionPack::getSubpackCount()
{
return mSubPackCount;
}

//添加子包,添加是否成功
bool   CollectionPack::append(BasePack &pack, unsigned short maxsize)
{
unsigned int currentlen = size(); //當前整個包的長度
unsigned int psize = pack.size(); //即將要加入的包的長度

if(psize + currentlen > maxsize || psize + currentlen > SESSION_BUFFER_LONGTH)
{
  return false; //不能夠再裝了
}

int len  = size() - 6;

memcpy(buffer + len, &pack,  pack.size());

//StringPack *p = (StringPack *) (buffer + len);
mSubPackCount ++;
return true;
}

//本集合包的總長度
unsigned short CollectionPack::size()
{
len = 0;
for(unsigned short i = 0; i < mSubPackCount; i ++)
{
  BasePack * p = (BasePack *) (buffer + len);
  len += p->size();
}
len += 6;     //(type len  SubPackNum 共6個字節)
return len;
}

//重載數組運算符,這樣就可以數組迭代的方式訪問子包了,不過用索引迭代沒有next迭代的效率高
BasePack * CollectionPack::operator[](int idx)
{
if(idx < 0 || idx >=mSubPackCount)
{
  return 0; //下標越界
}

int ln = 0;
for(unsigned short i = 0; i < mSubPackCount; i ++)
{
  BasePack * p = (BasePack *) (buffer + ln);

  if(idx == i)
   return p;
  else
   ln += p->size();
}

return 0;
}

//p迭代的指針,返回當前取出來的包的指針使用方法如下:
//   BasePack *p = 0;
//while(collection.next(&p))
//{
//  p就是當前你找到的包了
//}
BasePack *  CollectionPack::next(BasePack ** p)
{
char *cur = 0;

if((*p)==0)
  cur = buffer;
else
  cur = (char *)(*p);

//指針后移,定位到下一個包的位置
(*p)=(BasePack *)(cur + ((BasePack *)cur)->size());

if((*p)->type == 0)
  return 0; //沒有類型為0類型的包,如果為0,顯然是到末尾了
else
  return (*p);
}

有了以上這個容器,要把一些小包組合起來一起發送就非常方便了,但是組合的時候,還是要考慮不能超出上限范圍的
不過在真實的游戲服務器里面,包不一定是采用結構體的方式來發送的,有的是把對象串行化成為字節流的方式來發送。
我覺得這樣比較麻煩,要encoding decoding,效率調試都不方便,直接法結構體,高效,簡單,可就是不太安全。

posted on 2008-01-24 16:28 深藍色系統 閱讀(219) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿(75)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产美女搞久久| 国产婷婷色一区二区三区四区| 欧美激情精品久久久久久黑人| 99国产精品99久久久久久粉嫩| 国产一区二区激情| 国产精品欧美久久| 欧美国产一区二区在线观看| 久热综合在线亚洲精品| 久久精品国产亚洲a| 亚欧成人精品| 午夜在线视频观看日韩17c| 亚洲欧美成aⅴ人在线观看| 亚洲国产日韩欧美在线动漫| 亚洲福利视频一区| 在线观看日韩欧美| 一区二区三区在线免费视频| 国产精品久99| 久久久久久久久伊人| 欧美第十八页| 欧美理论视频| 欧美婷婷六月丁香综合色| 国产精品qvod| 亚洲人成亚洲人成在线观看图片| 亚洲一区二区三区精品在线观看 | 久久久久国产精品人| 欧美激情精品久久久久久免费印度| 亚洲欧美日韩在线综合| 亚洲另类在线视频| 亚洲国产欧美一区| 亚洲高清免费| 欧美黄在线观看| 欧美成年人视频| 亚洲国产成人不卡| 久久免费黄色| 亚洲狠狠婷婷| 亚洲午夜一区二区三区| 久久国产主播| 欧美黄色免费网站| 国产精品久久久久久久久久免费看 | 国产一区二区久久| 亚洲国产成人精品视频| 亚洲美女黄网| 亚洲欧美视频在线| 蜜桃av一区二区| 99re6这里只有精品| 亚洲一区二区综合| 久久久久久久久久久久久女国产乱| 美女主播一区| 国产精品欧美在线| 国产性色一区二区| 国产三级欧美三级日产三级99| 1769国产精品| 亚洲一区二区三区四区在线观看 | 亚洲美女在线一区| 亚洲一区三区视频在线观看| 亚洲少妇在线| 亚洲自拍偷拍麻豆| 米奇777在线欧美播放| 欧美丝袜一区二区| 国产精品一区免费视频| 亚洲激情网站| 亚洲欧美另类在线观看| 亚洲青涩在线| 欧美激情一二三区| 亚洲免费在线视频一区 二区| 免费高清在线一区| 国产日韩欧美中文| 一区二区三区国产在线| 亚洲视频一区| 欧美国产精品va在线观看| 亚洲在线观看免费视频| 欧美日韩第一区日日骚| 一区在线播放视频| 久久久久综合网| 亚洲欧美成人一区二区在线电影| 欧美高清在线视频| 在线色欧美三级视频| 久久久久综合| 久久精品久久综合| 国产一区二区精品久久| 亚洲精品综合| 欧美激情影院| 久久一二三四| 亚洲国产成人高清精品| 久久综合国产精品| 久久精品男女| 在线观看一区二区视频| 久久午夜精品| 久久精品五月婷婷| 国产精品wwwwww| 亚洲一区二区三区四区五区黄 | 亚洲国产成人91精品| 欧美a级在线| 男女激情视频一区| 亚洲精品久久| 国产精品第三页| 亚洲视频自拍偷拍| 免费日韩av电影| 99re8这里有精品热视频免费 | 亚洲女女女同性video| 欧美大秀在线观看| 在线欧美亚洲| 亚洲国产片色| 亚洲午夜av| 亚洲综合三区| 另类亚洲自拍| 亚洲黄色成人久久久| 国产伦精品一区二区三区高清版 | 亚洲专区免费| 午夜精品一区二区三区电影天堂 | 亚洲精品欧美激情| 国产精品露脸自拍| 亚洲一区二区三区三| 看片网站欧美日韩| 亚洲午夜精品一区二区三区他趣| 亚洲香蕉成视频在线观看| 亚洲欧洲av一区二区| 在线观看亚洲精品| 99re6这里只有精品| 欧美日韩专区在线| 欧美成人午夜激情| 欧美激情欧美激情在线五月| 欧美视频在线观看视频极品| 欧美激情精品久久久久久黑人 | 久久久伊人欧美| 亚洲欧美日韩第一区| 欧美日韩精品中文字幕| 亚洲第一福利视频| 激情国产一区二区| 亚洲影视九九影院在线观看| 一区二区三区 在线观看视频| 老司机免费视频一区二区| 久久国产精品99久久久久久老狼| 欧美日韩一区自拍| 亚洲国产精品悠悠久久琪琪| 在线看一区二区| 久久久亚洲综合| 久久伊人精品天天| 在线电影一区| 老鸭窝亚洲一区二区三区| 久久天堂av综合合色| 国产综合一区二区| 久久久久久日产精品| 欧美成人69av| 91久久久一线二线三线品牌| 久久综合久久久| 欧美成人资源| 日韩一本二本av| 欧美日韩在线观看视频| 99国产精品久久久久久久久久| 一区二区三区精品久久久| 欧美精品一区二区三区久久久竹菊| 亚洲国产欧美日韩精品| 一本色道久久综合狠狠躁的推荐| 欧美伦理影院| 亚洲天堂av图片| 久久精品视频在线| 亚洲国产成人久久综合一区| 免费观看亚洲视频大全| 亚洲美女电影在线| 性18欧美另类| 韩国福利一区| 欧美二区在线观看| 亚洲色图制服丝袜| 另类图片综合电影| 欧美一级夜夜爽| 亚洲国产乱码最新视频| 欧美绝品在线观看成人午夜影视| 99精品国产热久久91蜜凸| 欧美一区二区三区成人| 激情欧美一区二区三区| 欧美—级高清免费播放| 亚洲欧美国产日韩天堂区| 久久婷婷麻豆| 一区二区免费在线播放| 国产精品综合| 欧美xart系列高清| 亚洲一区二区三区在线播放| 免费成人网www| 亚洲伊人网站| 亚洲国产精品视频一区| 国产精品久久夜| 久热精品视频在线免费观看 | 久久久久久久欧美精品| 亚洲人成77777在线观看网| 国产精品一区二区久久久久| 老司机aⅴ在线精品导航| 亚洲中字在线| 亚洲国产精品悠悠久久琪琪| 久久精品青青大伊人av| 99re66热这里只有精品3直播| 国产欧美精品日韩区二区麻豆天美| 免费在线成人av| 香蕉久久夜色| 亚洲午夜激情免费视频| 亚洲激情中文1区| 老**午夜毛片一区二区三区| 午夜日韩在线| 制服诱惑一区二区| 亚洲国产专区|