王骏的BLOG
编程、网络技术点滴...
<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
公告

留言簿(24)

随笔分类

随笔档案

文章分类

文章档案

相册

WEB开发

相关链接

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-61 文章-5 评论-247 Trackbacks-0

依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题。

(1)线程之间的共享数据如何同步
CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有
需要同步的类都从CIntLock派生,例如:CWHQueue,CDBManager,CGlobalUserList,CUserInfo,CPlayerObject


(2)数据库是如何管理和连接的
数据库服务器DBSvr采用ODBC进行数据库连接,CConnection,CDatabase,CRecordset,CDBManager等类实现对数据库的管理,这几个类
对ODBC SDK进行了封装。
DBSvr.cpp:数据库连接采用一次连接多次使用的方式,在应用程序初始化函数InitInstance中,
GetDBManager()->Init( InsertLogMsg, szDatabase, "sa", "prg" );
进行数据库的连接。

(3)玩家处理线程ProcessUserHuman主要完成什么工作
GameSvr\ProcessUserHuman.cpp
ProcessUserHuman线程主要负责处理玩家的游戏动作以及数据的发送
pUserInfo->Operate(); // 执行玩家游戏动作
pGateInfo->xSend(); // 发送数据

(4)数据如何发送
在AcceptEx接受连接后,将套接字发送缓冲设置为0,
int zero = 0;
setsockopt(pGateInfo->sock, SOL_SOCKET, SO_SNDBUF, (char *)&zero, sizeof(zero) );

需要发送的数据通过m_pUserInfo->m_pGateInfo->m_xSendBuffQ.PushQ((BYTE *)lpSendBuff);
放入发送队列。由ProcessUserHuman线程中循环调用pGateInfo->xSend();进行发送。

因为发送缓冲已设置为0,那么接下去在pGateInfo->xSend()中调用WSASend将被阻塞,ProcessUserHuman线程中调用所有pGateInfo的xSend(), 数据将被顺序发送出去。

(5)CGateInfo有什么作用,对象是在哪里分配的
CGateInfo用于管理数据收发,包含于CUserInfo对象中。

GameSvr\SockMsg_GateComm.cpp
 AcceptThread中分配CGateInfo对象,并加入到全局列表中
  CGateInfo* pGateInfo = new CGateInfo;

  if (pGateInfo)
  {
   pGateInfo->m_sock = Accept;
   CreateIoCompletionPort((HANDLE)pGateInfo->m_sock, g_hIOCP, (DWORD)pGateInfo, 0);
   if (g_xGateList.AddNewNode(pGateInfo))
   ......

(6)CUserInfo有什么作用,对象在哪里分配
CUserInfo是非常重要的一个类,用于管理玩家信息,包含了
CPlayerObject* m_pxPlayerObject;
CGateInfo* m_pGateInfo;
Operate();
等重要变量与函数。

对于GameSvr:
GameSvr\GateInfo.cpp
 CGateInfo::OpenNewUser中,
 取出g_xUserInfoArr中空闲的CUserInfo对象加入到g_xLoginOutUserInfo列表中,然后对pUserInfo进行赋值
  pUserInfo->Lock();
  pUserInfo->m_sock = lpMsgHeader->nSocket;
  pUserInfo->m_pxPlayerObject = NULL;
  pUserInfo->m_pGateInfo = this;
  pUserInfo->Unlock();
对于LoginSvr:
CGateInfo有个变量CWHList<CUserInfo*> xUserInfoList;
CGateInfo::ReceiveOpenUser中分配CUserInfo对象,xUserInfoList.AddNewNode加入到xUserInfoList列表中

GameSvr与LoginSvr分配CUserInfo对象的方式的不同,其根本原因在于LoginSvr只在登录过程中使用CUserInfo,
不像GameSvr一样需要在整个游戏中时间使用CUserInfo对象。

(7)在何处投递收数据操作
GameSvr\SockMsg_GateComm.cpp
在AcceptThread线程中,接受一个连接后,pGateInfo->Recv();投递异步收数据操作
收缓冲位于:pGateInfo->OverlappedEx[0]中
工作线程ServerWorkerThread中,在收到数据并处理完成后继续投递异步收数据操作

(8)收数据完成后的处理
GameSvr\SockMsg_GateComm.cpp
工作线程ServerWorkerThread中,
if (lpOverlapped->nOvFlag == OVERLAPPED_RECV)
{
....
// 修改缓冲区数据实体的大小
pGateInfo->OverlappedEx[0].bufLen += dwBytesTransferred;
// 循环判断是不是完整的包
while ( pGateInfo->HasCompletionPacket() )
{
 // 解包操作...

(9)判断是否收到了完整的包
CGateInfo::HasCompletionPacket中,缓冲区收到的数据长度>=包头固定长度+包头中指明的数据区长度,就
认为收到了完整的包。

(10)如何进行解包操作
char * CGateInfo::ExtractPacket( char *pPacket )
{
 // 包大小=包头大小+数据区大小
 int packetLen = sizeof( _TMSGHEADER ) + ((_LPTMSGHEADER) &OverlappedEx[0].Buffer)->nLength;

 // 把完整的包复制到pPacket中
 memcpy( pPacket, OverlappedEx[0].Buffer, packetLen );

 // 把完整的包后面的数据移到缓冲区头部(解决粘包的问题)
 memmove( OverlappedEx[0].Buffer, OverlappedEx[0].Buffer + packetLen, DATA_BUFSIZE - packetLen );

 // 修改缓冲区数据大小
 OverlappedEx[0].bufLen -= packetLen;

 return pPacket + packetLen;
}

(11)如何处理玩家游戏数据
在ServerWorkerThread中解包操作完成后,如果数据类型是GM_DATA类型,调用pUserInfo->ProcessUserMessage
处理玩家游戏数据,调用m_pxPlayerObject->AddProcess,在AddProcess中分配PROCESSMSG对象,并将数据复制到
该对象中,然后Push到m_ProcessQ队列中待处理。ProcessUserHuman线程中遍历列表中的所有用户,调用
pUserInfo->Operate(),在CPlayerObject::Operate中从m_ProcessQ中Pop出游戏动作进行处理。

posted on 2007-12-11 16:11 王骏的BLOG 阅读(2191) 评论(13)  编辑 收藏
Comments
  • # re: 传奇游戏服务器源码学习
    gaoqing000
    Posted @ 2007-12-12 09:29
    pUserInfo->Operate(); // 执行玩家游戏动作


    这是怎么一回事啊
  • # re: 传奇游戏服务器源码学习
    fastzhao
    Posted @ 2007-12-14 16:55
    觉得传奇的服务器设计的比较烂,发送竟然用阻塞的!万一发送网络阻塞,那不就卡住了吗!
    还有就是个IOCP框架。没什么深奥的东西。
  • # re: 传奇游戏服务器源码学习
    Diviner
    Posted @ 2007-12-16 11:49
    to:fastzhao
    传奇的服务器版本有几个版本,最早人家是用delphi版本写的,后来国内一家公司改用C++实现了一下,但错误比较多。但毕竟实现了。

    好像不是堵塞的。
    IOCP框架要写得好,也不见得多么容易。
  • # 石油化工网
    石油化工网
    Posted @ 2007-12-17 20:46
    石油化工网
  • # re: 传奇游戏服务器源码学习
    bvcb
    Posted @ 2008-01-18 11:22
    <a href="http://www.hu-song.cn/eabout.htm">flexo printing machine</a> <a href="http://www.hu-song.cn/eKultur.htm">auto slitting machine</a> <a href="http://www.cnxinye.com">bag-making machine</a> <a href="http://www.hu-song.cn/eKultur.htm">die cutting machine</a> <a href="http://www.cnxinda.cn">制袋机</a> <a href="http://www.cnxinda.cn/lianx.htm">吹膜机</a><a href="http://www.chuangsj.com/myshow.asp">GOOGLE排名</a> <a href="http://www.zjbeiyin.com">压痕机</a> <a href="http://www.gxysjx.com">印刷机</a> <a href="http://www.gxysjx.com">吹膜机</a> <a href="http://www.65137889.com">印刷机械</a> <a href="http://www.65137889.com">凹版印刷机</a> <a href="http://www.dong-hai.net">印刷机</a> 
  • # re: 传奇游戏服务器源码学习
    bvcb
    Posted @ 2008-01-18 11:23
    <a href="http://www.lgxinfeng.com">丝印机</a> <a href="http://www.lgxinfeng.com">丝网印刷机</a> <a href="http://www.lgxinfeng.com">全动丝印机</a> <a href="http://www.lgxinfeng.com/101.asp">网印机</a> <a href="http://www.lgxinfeng.com/101.asp">晒版机</a> <a href="http://www.lgxinfeng.com/101.asp">拉网机</a> <a href="http://www.lgxinfeng.com/202.asp">UV光固机</a> <a href="http://www.lgxinfeng.com/202.asp">光固机</a> <a href="http://www.lgxinfeng.com/202.asp">胶印光固机</a> <a href="http://www.zyydjx.com">吹膜机</a> <a href="http://www.zyydjx.com">制袋机</a> <a href="http://www.zyydjx.com/about.htm">制袋机</a><a href="http://www.hu-song.cn/eabout.htm">label printing machine</a> 
  • # re: 传奇游戏服务器源码学习
    bvcb
    Posted @ 2008-01-18 11:23

    [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com]丝印机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com]丝网印刷机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com]全动丝印机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com/101.asp]网印机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com/101.asp]晒版机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com/101.asp]拉网机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com/202.asp]UV光固机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com/202.asp]光固机[/url] [url=http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com">http://www.lgxinfeng.com/202.asp]胶印光固机[/url] [URL=http://www.zyydjx.com">http://www.zyydjx.com]吹膜机[/URL] [URL=http://www.zyydjx.com">http://www.zyydjx.com]制袋机[/URL] 
  • # re: 传奇游戏服务器源码学习
    bvcb
    Posted @ 2008-01-18 11:23
    [URL=http://www.zyydjx.com/about.htm]制袋机[/URL] [URL=http://www.hu-song.cn/eKultur.htm">http://www.hu-song.cn/eKultur.htm]die cutting machine[/URL] [URL=http://www.hu-song.cn/eKultur.htm">http://www.hu-song.cn/eKultur.htm]auto slitting machine[/URL] [URL=http://www.hu-song.cn/eabout.htm]flexo printing machine[/URL] [URL=http://www.cnxinye.com]bag-making machine[/URL] [url=http://www.cnxinda.cn]制袋机[/url] [url=http://www.cnxinda.cn/lianx.htm]吹膜机[/url] [url=http://www.chuangsj.com/myshow.asp]GOOGLE排名[/url] [url=http://www.zjbeiyin.com]压痕机[/url][url=http://www.gxysjx.com">http://www.gxysjx.com]印刷机[/url] [url=http://www.gxysjx.com">http://www.gxysjx.com]吹膜机[/url] [url=http://www.65137889.com">http://www.65137889.com]印刷机械[/url] [url=http://www.65137889.com">http://www.65137889.com]凹版印刷机[/url] [url=http://www.dong-hai.net]印刷机[/url]
  • # re: 传奇游戏服务器源码学习
    FDGSF
    Posted @ 2008-06-10 10:39
    [URL=http://www.datianjx.cn">http://www.datianjx.cn]热切制袋机[/URL] [URL=http://www.datianjx.cn">http://www.datianjx.cn]冷切制袋机[/URL] [URL=http://www.cnxinye.cn]制袋机[/URL] [URL=http://www.ruianpack.com/aboutus.asp]夹链粘合制袋机[/URL][URL=http://www.zjrarj.com">http://www.zjrarj.com">http://www.zjrarj.com">http://www.zjrarj.com]制袋机[/URL][URL=http://www.zjrarj.com">http://www.zjrarj.com">http://www.zjrarj.com">http://www.zjrarj.com]吹膜机[/URL][URL=http://www.zjrarj.com">http://www.zjrarj.com">http://www.zjrarj.com">http://www.zjrarj.com]背心袋设备[/URL][URL=http://www.zjyifeng.com]压痕机[/URL][URL=http://www.cnchuangfu.com]压痕机[/URL][URL=http://www.cnchuangfu.com/about.htm]模切机[/URL][URL=http://www.cnchuangfu.com/about101.htm]全自动电脑模切机[/URL] [url=http://www.lihongcn.com]枕式包装机[/url] [url=http://www.lihongcn.com/index101.asp]月饼包装机[/url] [url=http://www.lihongcn.com/about.asp]面包包装机[/url] [url=http://www.lihongcn.com/about.asp]饼干包装机[/url] [url=http://www.lihongcn.com/bout.asp]求购包装机[/url] [URL=http://www.chuangsj.com/myshow.asp]GOOGLE排名[/URL][url=http://www.lihongcn.com/about101.asp]湿巾包装机[/url] [url=http://www.lihongcn.com/about101.asp]背封包装机[/url] [url=http://www.lihongcn.com/bout.asp]包装机价格[/url] [URL=http://www.lgxinfeng.com/E101.asp">http://www.lgxinfeng.com/E101.asp]Package Printing machinery[/URL] [URL=http://www.lgxinfeng.com/E101.asp">http://www.lgxinfeng.com/E101.asp]Packaging machinery[/URL][URL=http://www.hu-song.cn/eKultur.htm]die-cutting machine[/URL][URL=http://www.hu-song.cn/eproducts.htm]auto slitting machine[/URL]
  • # re: 传奇游戏服务器源码学习
    HGFDHG
    Posted @ 2008-06-10 10:39
    [URL=http://www.dybj.com/product/product.asp">http://www.dybj.com/product/product.asp]缠绕膜机[/URL][URL=http://www.lgxinfeng.com">http://www.lgxinfeng.com/Eabout.asp">http://www.lgxinfeng.com">http://www.lgxinfeng.com/Eabout.asp]Screen Printing Machine[/URL][URL=http://www.cnxinye.cn">http://www.cnxinye.cn]制袋机[/URL][URL=http://www.cnxinye.cn">http://www.cnxinye.cn]无纺布制袋机[/URL][URL=http://www.cnxinye.cn">http://www.cnxinye.cn/Prodzd.html]吹膜机[/URL][URL=http://www.cnxinda.cn/index1.asp]无纺布织布机[/URL][URL=http://www.ruianpack.com]制袋机[/URL] [URL=http://www.ruianpack.com/aboutus.asp]无纺布制袋机[/URL][URL=http://www.gxysjx.com">http://www.gxysjx.com]印刷机[/URL] [URL=http://www.gxysjx.com">http://www.gxysjx.com]吹膜机[/URL] [URL=http://www.hu-song.com]印刷机[/URL][URL=http://www.lgxinfeng.com">http://www.lgxinfeng.com]丝网印刷机[/URL] [URL=http://www.lgxinfeng.com">http://www.lgxinfeng.com]丝印机[/URL] [url=http://www.hu-song.com/web/cn_product.asp.htm]分切机[/url][URL=http://www.dybj.com/product/product.asp">http://www.dybj.com/product/product.asp]缠绕膜机[/URL]
  • # re: 传奇游戏服务器源码学习
    HGFDHG
    Posted @ 2008-06-10 10:39
    <a href="http://www.cnchuangfu.com/about101.htm">全自动电脑模切机</a><a href="http://www.cnchuangfu.com">压痕机</a><a href="http://www.lihongcn.com">枕式包装机</a><a href="http://www.lihongcn.com/index101.asp">月饼包装机</a> <a href="http://www.lihongcn.com/about.asp">背封包装机</a> <a href="http://www.lihongcn.com/about.asp">面包包装机</a> <a href="http://www.lihongcn.com/about.asp">饼干包装机</a> <a href="http://www.lihongcn.com/bout.asp">求购包装机</a> <a href="http://www.lihongcn.com/about101.asp">湿巾包装机</a> <a href="http://www.lihongcn.com/about101.asp">背封包装机</a> <a href="http://www.lihongcn.com/bout.asp">包装机价格</a><a href="http://www.lgxinfeng.com/E101.asp">Package Printing machinery</a> <a href="http://www.lgxinfeng.com/E101.asp">Packaging machinery</a><a href="http://www.hu-song.cn/eKultur.htm">die-cutting machine</a><a href="http://www.hu-song.cn/eproducts.htm">auto slitting machine</a>
  • # re: 传奇游戏服务器源码学习
    GFDSGF
    Posted @ 2008-06-10 10:39
    <a href="http://www.dybj.com/product/product.asp">缠绕膜机</a><a href="http://www.lgxinfeng.com/Eabout.asp">Screen">http://www.lgxinfeng.com/Eabout.asp">Screen Printing Machine</a><a href="http://www.cnxinye.cn">制袋机</a>">http://www.cnxinye.cn">制袋机</a> <a href="http://www.cnxinye.cn">无纺布制袋机</a> <a href="http://www.cnxinye.cn/Prodzd.html">吹膜机</a> <a href="http://www.cnxinda.cn/index1.asp">无纺布织布机</a><a href="http://www.ruianpack.com/aboutus.asp">无纺布制袋机</a> <a href="http://www.ruianpack.com">制袋机</a><a href="http://www.hu-song.com">印刷机</a><a href="http://www.lgxinfeng.com/Eabout.asp">Screen">http://www.lgxinfeng.com/Eabout.asp">Screen Printing Machine</a> <a href="http://www.lgxinfeng.com">丝印机</a> <a href="http://www.lgxinfeng.com">丝网印刷机</a><a href="http://www.hu-song.com/web/cn_product.asp.htm">分切机</a><a href="http://www.datianjx.cn">热切制袋机</a> <a href="http://www.datianjx.cn">冷切制袋机</a> <a href="http://www.cnxinye.cn">制袋机</a>">http://www.cnxinye.cn">制袋机</a> <a href="http://www.ruianpack.com/aboutus.asp">夹链粘合制袋机</a><a href="http://www.zjrarj.com">制袋机</a><a href="http://www.zjrarj.com">吹膜机</a><a href="http://www.zjrarj.com">背心袋设备</a><a href="http://www.zjyifeng.com">压痕机</a><a href="http://www.cnchuangfu.com/about.htm">模切机</a>
  • # re: 传奇游戏服务器源码学习
    bvc
    Posted @ 2008-06-28 11:25

     [url=http://www.syouei.cn">http://www.syouei.cn]电风扇[/url]
    [url=http://www.syouei.cn">http://www.syouei.cn]电风扇厂家[/url]
    [url=http://www.zschenghui.cn">http://www.zschenghui.cn">http://www.zschenghui.cn">http://www.zschenghui.cn]树脂工艺品[/url]
    [url=http://www.zschenghui.cn">http://www.zschenghui.cn">http://www.zschenghui.cn">http://www.zschenghui.cn]树脂工艺礼品[/url]
    [url=http://www.zschenghui.cn">http://www.zschenghui.cn">http://www.zschenghui.cn">http://www.zschenghui.cn]树脂灯饰配件[/url]
     [url=http://www.dahongxin.cn]电子秤[/url]
     [url=http://www.zshuanqiu.com]中山发电机[/url]
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]