VC & C++ 源码
// 帐号服务器,设计说明
// 仙剑修,2001.11.12
一、帐号服务器功能分为两部分:
1、客户端登录线程:取得认证ID号AuthenID。
客户端连接到帐号服务器(以后可改为UDP)
登录后服务器到帐号数据库查帐号
返回认证ID号,并断开连接(如出错则返回错误)
将该认证ID号传给计点线程,转发给游戏服务器,用于玩家登录游戏服务器。
2、实时计点:与游戏服务器连接通讯,计算玩家使用的点数。(可提高线程优先级)
游戏服务器启动时登录到帐号服务器。
玩家登录后实时发送计点消息给帐号服务器。
玩家退出时通知帐号服务器。
玩家点数耗尽时通知游戏服务器踢人。
游戏服务器向帐号服务器查询剩余点数(计点、计时、计帐分别处理)
3、主线程:创建两个子线程。处理界面操作。
二、玩家登录时的三方会话
。客、帐会话:
。上传:帐户名,口令,游戏服务器名。CMsgAccount
。下传:帐号ID(错误为0),认证ID(错误时,1为帐号名或口令错,6为点数不足,7为包月超时, 10服务器未开, 11已登录, 12封号, 13计费帐号口令错, 14计费帐号满, 20服务器忙,21服务器满, 999未知(数据库类型错))
,游戏服务器IP(或出错文字信息)。CMsgConnect
。帐、游会话:
。下传:帐号ID,认证ID,客户端IP。CMsgConnect
。上传:正常时上传开始计费和计费,如不能登录或超时则必须上传一个FEE_END消息。CMsgFee
★注意:帐号服务器中的在线表超时时,帐号服务器会重复下传该消息。游戏服务器的超时应该比帐号服务器的超时长。
但帐号服务器中的在线表不应立即删除,提前删除会丢失同步状态信息。(暂时未回收丢失的在线表,也可半小时后回收)
。客、游会话:
。上传:帐号ID,认证ID。CMsgConnect
。下传:多个角色数据。CMsgRole
。下传:玩家ID(错误为0,不分类)。CMsgLogin
。异常:
1、客户端登录帐号服务器后,未登录游戏服务器。(游戏服务器要定时删除超时的帐号)
2、客户端登录游戏服务器后,帐号服务器长期不下传认证ID给游戏服务器。(游戏服务器要定时删除超时的帐号)
三、计点消息(注:暂按此简单方案实施,安全方案详见“当前任务”中)
。上传消息:
计点:帐号ID,TYPE(开始,计费,结束,HEARTBEAT)。CMsgFee
“计费”时减点。“HITBEAT”用计点消息临时代替心跳消息,客户端直接返回相同的包。
查询:帐号ID。CMsgQueryFee
。下传消息:
心跳:帐号ID,TYPE(HEARTBEAT)。CMsgFee
查询:帐号ID,计费类型(计点,包月,ISP计帐),剩余点数(或计帐点数),剩余时间。CMsgQueryFee
时间为DWORD,(time/10000)表示年,(time/100)%100 表示月, (time)%100表示日。
踢人:帐号ID,TYPE(KICKOUT)。CMsgFee
四、登录过程
。登录消息:
上传:游戏服务器帐户名,口令,游戏服务器域名/IP。CMsgAccount
可能需要校验游戏服务器IP。
下传:游戏服务器帐号ID(错误为0,不分类),版本号。CMsgLogin
。版本消息:(★注意:仅当版本号正确时,游戏服务器才能上传该消息。如失败应立即主动断开SOCKET)
上传:版本号,游戏服务器名。CMsgLogin
帐号服务器接收到该消息后,表示游戏服务器已经登录成功。
// 下传:无意义。CMsgConnect
// 暂时仅回传无意义的消息。
五、安全
1、与游戏服务器的断线重连与重新同步
。游戏服务器需要定时重连接到帐号服务器
。重新连接后,会重新登录。在上传“版本消息”前,需要上传所有当前玩家消息,以实现完全同步。
2、客户端的攻击
。记录最近5个(或50个)帐号错误的登录申请的IP地址。每个IP最多可以有10次错误登录,否则锁定5分钟该IP,并写日志和面板警告。
。可以做一个IP黑名单,禁止某些IP几天。
。允许从机器上手工封锁IP地址
3、线程安全与自维护策略
。在面板上显示两个线程的动态数据,以手工了解两个线程的运行状况。
。可手工重启计点线程或登录线程
。计点线程检查是否长时间没接收到登录线程发过来的新玩家,否则询问线程是否正常。
。登录线程检查是否长时间没有计点线程发过来的回应消息,否则询问线程是否正常。
4、防双重登录策略(防炒钱)
。每次重新登录时,都让玩家进入上一次登录的服务器。利用游戏服务器的防双重登录功能自动“顶”下上一个玩家。
。游戏服务器必须确认“完全”退出后(从核心退出-LOGOUT,从登录表退出,从底层CONNECT退出),才向帐号服务器上传ENDFEE消息。
。帐号服务器在线表延时删除(WAITTIME)。以防原游戏服务器在ENDFEE后又“紧随”上传BEGINFEE消息。
六、帐号数据库变更历史日志数据库(暂时做成LOG文件)
。帐号服务器运行日志
。游戏服务器登录日志
。客户端登录日志
。帐号记点日志
////////////////////////////////////////////////////////////////////////////
设计模块:
1、游戏服务器:
与客户端:
客户端连接:接收到认证ID并与认证ID表核对
与帐号服务器:
认证部分:
认证:接收到认证ID并存于一个队列表中。
*认证ID表:帐号ID,认证ID,客户端IP。
计点部分:
登录、记点、查询、自动重连接。
*玩家计点表:/*游戏服务器ID*/,角色ID,帐号ID,/*口令*/,认证ID,客户端IP,/*计点类型(计时,包时,计帐)*/,
开始计点时间,LAST计点时间,结束计点时间,
结束类型(客户端退出,游戏服务器踢人,帐号服务器踢人),状态(登录中,游戏中)。
2、帐号服务器:
游戏计点线程:(先创建该线程,因为客户监听线程会传消息过来???)
与游戏服务器:
站点连接:登录、记点、查询
与数据库:
数据库连接:查询、修改点数
客户监听线程:
与客户端:
客户端连接:查询认证ID
与数据库:
数据库连接:查询帐号
全局变量:
*玩家在线表:游戏服务器ID,帐号ID,帐户名,口令,当前角色ID,认证ID,客户端IP,
计点类型(计时,包时,计帐),开始计点时间,LAST计点时间,结束计点时间,
结束类型(客户端退出,游戏服务器踢人,帐号服务器踢人),状态(登录中,游戏中)
////////////////////////////////////////////////////////////////////////////
网吧计费功能设计说明:
1、数据库增加licence字段,以支持网吧帐号。网吧帐号的type为3。
2、在线表中增加“计费帐号”属性,普通帐号的计费帐号同登录名。
3、增加网吧登录消息_MSG_BARACCOUNT。
4、为简单起见,暂时先不设计网吧帐号管理对象。每次登录时,即时统计该网吧帐号的已登录数量,并与数据库的licence比较。