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

我的玻璃盒子

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

原文:http://m.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>
            亚洲激情av| 久久久久久久999| 正在播放亚洲一区| 91久久精品一区二区别| 亚洲成人自拍视频| 精品va天堂亚洲国产| 国内精品写真在线观看| 亚洲高清资源| 中日韩高清电影网| 欧美中文字幕视频| 欧美顶级艳妇交换群宴| 亚洲国产精品一区二区久| 亚洲电影免费观看高清完整版在线| 欧美成人午夜影院| av成人老司机| 久久久久久国产精品一区| 欧美激情自拍| 国产精品午夜久久| 国产伦理一区| 久久av老司机精品网站导航| 久久综合精品一区| 国产精品成人一区二区三区吃奶 | 小辣椒精品导航| 久久伊伊香蕉| 亚洲精品免费电影| 欧美在线播放一区| 欧美日韩亚洲成人| 国产婷婷一区二区| 亚洲美女电影在线| 久久精品卡一| 一区二区三区免费观看| 久久综合国产精品| 国产欧美精品日韩| 一本大道久久a久久综合婷婷| 久久久久9999亚洲精品| 亚洲精品综合| 免费日韩av片| 黄色亚洲免费| 欧美一区激情视频在线观看| 亚洲精品中文字幕女同| 久久久久久夜精品精品免费| 国产精品久久久亚洲一区| 亚洲三级电影在线观看| 久久婷婷亚洲| 欧美亚洲在线观看| 国产精品最新自拍| 亚洲欧美国产视频| 一区二区三区久久| 欧美视频一区二区| 亚洲视频欧美在线| 99日韩精品| 欧美偷拍另类| 亚洲无人区一区| 亚洲日本欧美| 欧美国产日韩一二三区| 亚洲精品四区| 亚洲精品免费在线观看| 欧美精品久久一区| 亚洲精品一区二区三区在线观看| 久久夜色精品亚洲噜噜国产mv | 亚洲人成在线观看网站高清| 玖玖视频精品| 小处雏高清一区二区三区| 国产精品日韩在线播放| 亚洲免费网站| 午夜久久影院| 国产日本欧美一区二区三区| 亚洲永久精品大片| 亚洲在线观看免费| 国产精品久久久久9999吃药| 欧美一级黄色网| 性色av香蕉一区二区| 国内综合精品午夜久久资源| 欧美日本网站| 亚洲国产精品久久久久婷婷884| 欧美主播一区二区三区| 狠色狠色综合久久| 欧美成人在线免费视频| 欧美日韩高清区| 欧美一区二区日韩| 久久久久久久久蜜桃| 亚洲日本在线观看| 一区二区成人精品 | 国产伦精品一区二区| 亚洲综合精品一区二区| 亚洲欧美中文另类| 最近看过的日韩成人| 一区二区三区四区精品| 国产一区二区三区在线观看免费| 欧美二区不卡| 国产精品r级在线| 美女精品视频一区| 欧美精品一区在线观看| 久久国产精品一区二区三区四区| 久久综合一区| 亚洲一区二区三区高清不卡| 午夜精品国产更新| 亚洲精品小视频| 欧美一级网站| 夜夜爽av福利精品导航| 性xx色xx综合久久久xx| 99精品国产热久久91蜜凸| 宅男噜噜噜66国产日韩在线观看| 国产中文一区二区| 一本色道久久综合精品竹菊| 亚洲福利一区| 欧美影院午夜播放| 亚洲一区二区三区激情| 久久视频一区二区| 欧美中文字幕久久| 欧美亚一区二区| 最新国产成人在线观看| 国外成人在线| 午夜精品在线观看| 日韩视频精品在线| 久久爱另类一区二区小说| 中国成人在线视频| 久久一区精品| 老司机午夜免费精品视频| 欧美午夜剧场| 91久久国产综合久久| 黄色亚洲免费| 午夜精品美女久久久久av福利| av成人天堂| 欧美精品播放| 亚洲高清不卡在线| 在线日本成人| 久久久精品日韩| 欧美在线综合| 国产精品白丝黑袜喷水久久久| 欧美国产高潮xxxx1819| 亚洲高清久久网| 久久久久国产成人精品亚洲午夜| 久久成人一区二区| 国产伦理精品不卡| 亚洲一区二区影院| 亚洲女与黑人做爰| 欧美日本一区二区三区| 亚洲欧美日韩一区| 麻豆成人在线播放| 欧美电影在线观看| 亚洲精品美女| 欧美日韩成人综合| 亚洲视频精品| 亚洲综合三区| 国产日本欧洲亚洲| 久久av资源网| 亚洲电影中文字幕| 一本久久知道综合久久| 欧美日韩视频专区在线播放 | 国产精品一级久久久| 午夜一级在线看亚洲| 久久综合九色综合欧美就去吻| 怡红院精品视频在线观看极品| 久久久久久穴| 99精品国产高清一区二区| 亚洲欧美国内爽妇网| 好吊色欧美一区二区三区四区| 快she精品国产999| 亚洲精品影院| 久久国产一二区| 亚洲高清视频在线| 欧美啪啪一区| 一区二区三区欧美在线| 欧美综合第一页| 最新国产精品拍自在线播放| 欧美日韩视频在线第一区| 欧美在线视频不卡| 亚洲精美视频| 久久婷婷一区| 亚洲欧美国产高清| 最新日韩中文字幕| 国产日韩欧美在线视频观看| 欧美fxxxxxx另类| 一本色道久久综合亚洲精品小说| 欧美在线啊v一区| 一区二区三区亚洲| 国产精品成人免费精品自在线观看| 久久av一区二区三区| 日韩视频在线播放| 另类国产ts人妖高潮视频| 亚洲欧洲综合| 国产一区二区中文字幕免费看| 欧美激情精品| 久久久久中文| 午夜精品久久久久99热蜜桃导演| 欧美国产日韩一区| 欧美一区亚洲| 一区二区三欧美| 亚洲日本欧美天堂| 伊人久久亚洲美女图片| 国产精品入口66mio| 欧美日韩久久久久久| 欧美电影在线观看| 久久人人看视频| 久久久www| 香蕉久久夜色精品| 亚洲欧美日韩精品久久久| 亚洲美女一区| 99国产成+人+综合+亚洲欧美|