<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
LoginSvr服务器
g_gcSock Local 5500端口
1.首先从LoginSvr.cpp WinMain分析:
1)CheckAvailableIOCP : 检查是不是NT,2000的系统(IOCP)
2)InitInstance: 初始化界面,加载WSAStartup
GetDBManager()->Init( InsertLogMsg, "Mir2_Account", "sa", "prg" );
数据库管理类,做底层数据库操作。
3) MainWndProc窗口回调函数OnCommand:
IDM_STARTSERVICE:
创建LoadAccountRecords线程
a). UPDATE TBL_ACCOUNT重置帐户验证状态。
b). 读服务器列表(TBL_SERVERINFO, selGate服务器),加入g_xGameServerList
遍历xGameServerList列表,把服务器信息加入到一个字符数组g_szServerList中。
c). 启动InitServerThreadForMsg线程。
d). 调用InitServerSocket函数创建两个线程:
AcceptThread线程:
ServerWorkerThread线程:
调用InitServerSocket函数创建两个线程:
1) AcceptThread线程:
Accept之后生成一个CGateInfo对象,CGateInfo->sock = Accept; 客户端Socket值赋值给结构体。记录客户相关信息。新的套接字句柄用CreateIoCompletionPort关联到完成端口,然后发出一个异步的WSASend或者WSARecv调用(pNewUserInfo->Recv();接收客户端消息),因为是异步函数,WSASend/WSARecv会马上返回,实际的发送或者接收数据的操作由WINDOWS系统去做。然后把CGateInfo对象加入g_xGateList中。在客户accept之后,投递一个I/O(recv)。
分析一下g_xGateList发现,每个CGateInfo里有sock; xUserInfoList,g_SendToGateQ,该网关的相关信息依次(网关对应的sock, 用户列列信息,消息队列),可以为多个LoginGate登录网关服务。
2) ServerWorkerThread线程:
ServerWorkerThread线程工作原理:
循环调用GetQueuedCompletionStatus()函数来得到IO操作结果。阻塞函数。当WINDOWS系统完成WSASend或者WSArecv的操作,把结果发到完成端口。GetQueuedCompletionStatus()马上返回,并从完成端口取得刚完成的WSASend/WSARecv的结果。然后接着发出WSASend/WSARecv,并继续下一次循环阻塞在GetQueuedCompletionStatus()这里。
a).if (g_fTerminated) 线程结束前:循环遍历g_xGateList,取出pGateInfo关闭套接字,并删除节点。dwBytesTransferred =0 ,关闭该服务器套接字。
b).while ( pGateInfo->HasCompletionPacket() ) 验证消息格式。
case '-': 发送心跳数据包到每个LoginGate服务器。
case 'A': 处理每个LoginGat服务器转发的客户端的消息增加到各自网关(CGateInfo)g_SendToGateQ队列中,然后ThreadFuncForMsg线程进行验证后再发送消息到各个LoginGate服务器。
pGateInfo->ReceiveSendUser(&szTmp[2]);
case 'O':处理每个网关Accept客户端后增加pUserInfo用户信息到各自网关的xUserInfoList列表中。
pGateInfo->ReceiveOpenUser(&szTmp[2]);
case 'X':处理每个网关收到客户端Socket关闭之后发送过来的消息。设置该网关socket相应状态。
pGateInfo->ReceiveCloseUser(&szTmp[2]);
case 'S': GameSvr服务器发送的消息,更新TBL_ACCOUNT,验证字段,说明用户已下线,下次登录必须先到LoginSvr服务器再次验证。
pGateInfo->ReceiveServerMsg(&szTmp[2]);
case 'M': GameSvr服务器发送的消息,创建一个用户的消息,把用户ID,密码,名字插入TBL_ACCOUNT表中插入成功返回SM_NEWID_SUCCESS,否则SM_NEWID_FAIL,把在信息前加#,信息后加! 不做TBL_ACCOUNTADD表的添加,只增加TBL_ACCOUNT表信息。
‘A’:是LoginGate 服务器转发客户端消息到g_xMsgQueue队列, 由ThreadFuncForMsg线程处理后,转发到各个loginGate服务器
继续投递I/O操作。
启动InitServerThreadForMsg 创建ThreadFuncForMsg线程。c
收到loginGate服务器发送过来的消息之后,ServerWorkerThread经过数据包分析之后(case 'A'),把客户端的消息,写入g_SendToGateQ队列中,然后在本线程中再进行处理。
遍历g_SendToGateQ队列中数据,验证数据包是否正确(#!字符)根据DefaultMsg.wIdent标志
case CM_IDPASSWORD: 处理登陆业务
遍历xUserInfoList用户列表信息,到数据库表TBL_ACCOUNT中找相应信息,如果失败发送(SM_ID_NOTFOUND, SM_PASSWD_FAIL)消息,否则发送SM_PASSOK_SELECTSERVER+ g_szServerList(SelGate服务器列表消息)
SelGate服务器列表消息(对应TBL_SERVERINFO数据库表中数据),供用户选择登录的SelGate服务器。
CM_SELECTSERVER: 选择服务器(SelGate)
遍历xUserInfoList用户列表信息,根据socket,找到用户密钥,消息解密后,遍历g_xGameServerList列表,把用户选择的SelGate服务器转化为IP地址,发送至LoginGate服务器,再转发至客户端。设置该用户SelServer的标志状态。从该网关的xUserInfoList用户列表中删除该用户。
CM_ADDNEWUSER:新注册用户
判断用户名是否已存在,失败发送SM_NEWID_FAIL消息,成功,写插入表数据,并发送SM_NEWID_SUCCESS消息到 LoginGate服务器,转发至客户端。
IDM_STOPSERVICE: 停止服务(IOCP模型Server响应客户端请求)
Close -> OnCommand(IDM_STOPSERVICE, 0L); ->g_fTerminated = TRUE; 三个线程退出。
主要流程:
服务启动后,LoginSvr启动了AcceptThread,和ServerWorkerThread线程,AcceptThread线程接收loginGate,GameSvr服务器连接,加入g_xGateList网关列表中,ServerWorkerThread线程从完成端口取得刚完成的WSASend/WSARecv的结果后,进行分析处理两个服务器发送来的消息。服务启动同时,启动ThreadFuncForMsg线程,该线程从g_xMsgQueue(iocp读到的loginGate服务器发来的数据)中取出数据,处理数据。投递I/O,利用IOCP模型,发送到loginGate服务器。
相关推荐
服务器端代理是保存在SQLServer主机中的一个只读存储过程,他的作用是接受客户端请求,读取在线事物日志块并通过网络传给客户端软件,由客户端软件来读取这些原始的数据块来完成Log Explore所提供的所有功能。...
最近天涯明月刀开启了首次内测,由于放号量大,玩家热情高,服务器一直 承担很大的压力,生怕由于宕机不可恢复等原因造成玩家流失或是口碑下降。好 在通过一系列预定方案的实施和不断优化, 虽然开服期间也出现过...
ChatGPT4.0知识问答、DALL-E生成AI图片、Code Copilot辅助编程,打开新世界的大门
基于matlab实现DOA 估计和自适应波束形成.rar
基于C++的线程安全容器。.zip
华为数字化转型实践28个精华问答glkm.pptx
本周-综合案例.zip
基于Swift简单易上手的iOS开发框架.zip
liba52-0-32bit-0.7.5+svn613-1.19.x86_64
本次的设计主要是通过对动漫系统开发的背景、现状进行了分析,总结出了本次动漫之家系统开发的意义。根据此次开发的目的和意义,本次的系统开发选择了SSM框架、HTML5以及idea平台来进行动漫之家系统的开发,通过MySQL来进行数据库的开发。通过对整个动漫之家系统进行功能需求的调查研究,通过对此次的系统开发进行可行性的分析。通过实体图模型以及功能结构模型来对本次的系统开发进行了整体的开发。在整个系统开发完毕之后,通过截图说明的方式来进行系统功能的介绍,最后通过系统测试来对本次系统的完整性进行测试,最终通过本次的开发,整个动漫之家系统可以实现很好的运行,起到了为动漫爱好者提供动漫资讯的功能运行。 在前端的系统开发上,主要是为了给动漫爱好者们提供一个在线交流、在线观看动漫、在线购买动漫周边的综合性服务平台。通过这个平台,可以通过注册成为会员后,在动漫内容下进行留言互动来实现更好的动漫交流与观后感的分享,可以提高站内用户对于该网站的使用兴趣。而后台则主要为该动漫之家系统的管理员提供管理服务,后台的管理中,管理员能 关键词:动漫之家;论坛网站;SSM框架;MySQL数据库
基于matlab数字图像处理的黄豆数量识别(GUI界面),基于matlab数字图像处理的黄豆数量识别(GUI界面),基于matlab数字图像处理的黄豆数量识别(GUI界面)
数字化转型数据架构设计方法论及案例qy.pptx
在 Apple Silicon Mac 上入门汇编语言.zip
2024年中国微光夜视相机行业研究报告
liba2ps1-4.14-bp154.2.102.s390x
1222222222222
一个基于C++的IM实现.zip
显示温度和电压测量值在一个LCD屏幕上
ASP娱乐KTV夜场人才招聘信息资源网站源码 PC+WAP.rarASP娱乐KTV夜场人才招聘信息资源网站源码 PC+WAP.rar
基于嵌入式