qq西游为什么qq西游连接服务器失败败

1173人阅读
从零开始写游戏(1)
网关服务器入网流程:
s1.连接网关管理器
s2.上报自身信息给网关管理器
s3.从网关管理器获取自己的管理信息
*s4.按照管理信息预分配好需要的资源
s5.网关服务器打开客户端***端口
s6.网关服务器开始转发“管理器”和客户端的数据
*网关服务器完全不理解来自客户端的数据(对客户端而言是透明的)
*网关服务器和“管理器”之间存在协议栈,有五个高级命令:转发,广播转发,T下线1,T下线2,关闭网关
*网关服务器会定时给“管理器”发送心跳请求ping
*网关服务器会维护客户端状态机:Freed、Starting、InUse、Stoping
GateWayServer抽象网关逻辑以及和管理器的连接,处理管理器命令,并且转发客户端和管理器的消息
GWClient抽象网关到客户端连接,负责处理网关和客户端的逻辑
网关启动后,GateWayServer会打开***端口,当新的连接上来以后,会创建一个新的GWClient对象,并且将新的socket连接郊游GWClient管理。GWClient管理客户端和网关服务器之间的通讯数据:接受到客户端的数据会交由GameWayServer对象转发到指定的管理器,GameWayServer也会将管理器发送给客户端的数据交由GWClient发送到客户端。
即在网关服务器内部:GWClient做为客户端的代理,GateWayServer做为管理器(逻辑服务器)的代理。
// 禁用nagles算法
int nodelay = 1;
if(ACE_OS::setsockopt(new_handle,IPPROTO_TCP, TCP_NODELAY,(char*)&nodelay,sizeof(nodelay))==-1)
ACE_ERROR( ( LM_ERROR, ACE_TEXT(&Set socket TCP_NODELAY failed!!\n&)) );
1.缺少对客户端的安全检测,也许是放到后面的逻辑服务器上去做了。不能排除恶意连接,或者误操作的连接,所有的连接都被accept上来,然后做数据交换。
2.数据的分发上,好像一个网关服务器只能对应一个管理器(逻辑服务器)
3.网关只能标识到连接(SettionID是用户逻辑无关的),无法识别到具体逻辑客户端
尝试做低级抽象:
IGateWayClientAccpetor
& OnClientAccept
IGateWay2ClientSession
& SessionID
& OnConnect
IGateWay2ManagerSession
& SessionID
& OnConnect
IGateWayDataRouter
& OnAccessRouting(IGateWay2ClientSession)
& OnAccessRouting(IGateWay2ManagerSession)
& OnGateWay2ClientSessionRead(来自客户端的数据,当前代码下,会转发给唯一的管理器处理)
& OnGateWay2ManagerSession(来自管理器的数据,如果是需要转发给客户端的数据,会包含有客户端SessionId)
协议概览:
网关管理服务器 协议:
enum EGWMgrMsgType
GWMMT_Msg,
// Route server msg to clients.
GWMMT_MsgAll,
// Route server msg to all clients.
GWMMT_Droped,
// *A client has been droped by manager( actively or disconnect ack ).
GWMMT_DropedDiscard,
// *A client has been droped by manager( actively or disconnect ack ).
GWMMT_Shutdown,
// Shutdown gateway server.
GWMMT_Max,
GWMMT_Msg: 转发消息到指定客户端
GWMMT_MsgAll: 转发广播消息到全部客户端
GWMMT_Droped: 网关管理器T掉指定客户端
GWMMT_DropedDiscard: 网关管理器T掉指定客户端
GWMMT_Shutdown: 关闭网关服务器
---------------------------------------------------------------------------------------
网关服务器 协议:
enum EGWSVMsgType
GWSMT_CLJoin,
// New client join.
GWSMT_CLDisconnected,
// Client disconnected.
GWSMT_Msg,
// Route client message to server.
GWSMT_Ping,
// gateway ping message to server.
GWSMT_Max,
GWSMT_CLJoin: 新连接客户端
GWSMT_CLDisconnected: 客户端连接断开
GWSMT_Msg: 将客户端的消息转发到服务器
GWSMT_Ping: 网关服务器到逻辑服务器的ping
-----------------------------------------------------------------------------------
网关服务器消息头:
struct GWMsgHdr
GWMsgHdr( u_int type, u_int len ):type_( type ), data_len_(len){}
type_; // Msg type.
data_len_; //
------------------------------------------------------------------------------------
网关上报给网关管理器的自身信息
struct GWLocalInfo &// ***客户端连接的endpoint
addr_; // Gateway listen address.
------------------------------------------------------------------------------------
网关从网关管理器接受的信息
struct GWInfo
id_; // Gateway server id.
cl_num_; // Client num.
设计特点:
1.启动参数通过内存共享,本地,可以被其他程序访问到,也许直接被共享到集群了,没有深入去看
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:79614次
积分:1376
积分:1376
排名:千里之外
原创:52篇
转载:10篇
评论:11条
(2)(1)(7)(7)(15)(10)(7)(2)(2)(5)(4)

参考资料

 

随机推荐