石器时代之saac

1、  前言
       最近在看网山下载的石器时代Server的代码,上周看完saac(帐号服务器)后觉得里面有些东西值得借鉴和思考。写本文的目的只是在于抛砖引玉,和各位开发游戏的同志们进行交流。
       石器时代是日本人开发的网络游戏,服务器运行在linux下。代码中的注释大部分是日文,所以看的过程中有点痛苦!手上的Server代码全部都是用C写的,整体上分为2部分:gmsv和saac。按照我的理解,gmsv全称应该是game server,是和客户端打交道的游戏服务器;saac全称是stoneage account server,是用于操作后台数据的帐号服务器。目前只看完了saac部分,只能输出这部分的总结,后续看完gmsv后再写对应的心得。

 2、saac框架

       

        saac主要包括五部分功能:mail(邮件)、family(家族)、char(角色)、PK、chatroom(聊天室),lock是用于操作帐号相关数据时加锁。可能是当时玩网游的人不是很多,服务器的压力不大,并且当时的机器硬件条件有限,导致saac采用的是单进程实现。这也意味着上面5个功能系统实现时并不是真正设计意义上的子系统划分,采用的是功能函数族,互相之间耦合度较紧。另外,mail、family、char、PK、mission的数据全部都是存储在文件中,所以文件数据读写占了不小的篇幅。

       gmsv与saac通信的协议为字符串协议,前2个参数固定为消息id(msgid)、请求消息名称(funcname),后面为该消息的参数,参数个数不定。
3、main详解         
       saac在main函数中加载完数据和配置文件后,创建了2个监听套结字:mainsockfd和worksockfd。
        main主循环流程:
        在main函数的while循环中mainsockfd不断接受gmsv发起的连接,接收请求消息内容后调用函数saacproto_ServerDispatchMessage进行分发处理。处理是根据消息中第2个参数funcname调用saacproto_funcname_recv进行请求处理,处理完成后调用saacproto_funcname_send发送响应结果。实际上saacproto_funcname_recv会调用funcnam对应功能子系统的簇函数进行数据操作,如果数据涉及到用户帐号,如char、family等操作前需要向lock部分请求加锁,只有加锁成功后才能对数据进行操作。
       worksockfd用于接收saac内部的请求消息,调用该请求对应的回调函数,如charLoadCallback(角色数据加载)、charListCallback(列举用户帐号所有角色)、charDeleteCallback(删除角色)等。当初看到这个worksockfd时,以为会启动一个单独的进程进行这些操作,结果没想到还是在一个进程里做。
 
4、 套接字缓冲区
        
saac管理连接使用的数据结构是connection,定义如下:
struct  connection
{
    
int use;            //该连接是否在使用
    int fd;               //用于该连接通信的socket
   int
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值