myicq1.0a1服务器代码分析(三)服务器集群

原创 2003年12月02日 09:59:00

myicq1.0a1服务器代码分析()服务器集群

顾剑辉(Solarsoft)

服务器集群其实是服务器之间建立联系,并维护这样的联系,:玩联众时,你会看到很多服务器,那它们是怎样共同工作的呢!分析如下:

服务器与服务器之间一般用TCP进行连接,并在每个服务器中都建立这个表,表中包括相应的信息,如服务器IP,port,包括游戏的每个服务器在线人员人数,等等.当你进入别的游戏主机时,其实是一个退出当前服务器,登入其他服务器的过程,相应的在线数据,服务器之间会传送好的.

接下去,我们一起来看一下,myicq是怎样做到集群的.

class ServerHash {

public:

       void put(Server *s) {

              int i = hashfn(s->ip);

              hash[i].addHead(&s->hashItem);

       }

       Server *get(uint32 ip);

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

private:

       int hashfn(uint32 ip) {

              return (ip & (SERVER_HASH_SIZE - 1));

       }

 

       ListHead hash[SERVER_HASH_SIZE];

};

 

Server *ServerHash::get(uint32 ip)

{

       int i = hashfn(ip);

       ListHead *head = &hash[i];

       ListHead *pos;

 

       LIST_FOR_EACH(pos, head) {

              Server *s = LIST_ENTRY(pos, Server, hashItem);

              if (s->ip == ip)

                     return s;

       }

       return NULL;

}

ListHead Server::serverList;

static ServerHash serverHash;

这里其实是服务器在线列表的hash表管理,这个hash管理不清楚的,你可以看一下我的文章().

再来看一下,用于服务器连接的socket,其中RefObject是起个计数器的作用.

class Server : public RefObject {

public:

       Server();

       virtual ~Server();

 

       void onDnsResolved(uint32 ip);

       void onConnect();

       void onReceive();

       void onClose();

 

       bool connect(uint32 ip, uint16 port);

       RemoteSession *getSession(uint32 uin);

 

       void sendUserOnline(Session *s);

       void sendUserOffline(uint32 uin);

       void sendUserStatus(uint32 uin, uint32 status);

       void sendMessage(uint8 type, uint32 dst, uint32 src, ICQ_STR &text);

       void addFriend(uint16 seq, uint32 dst, uint32 src);

       void delFriend(uint32 dst, uint32 src);

       void updateContact(uint16 seq, uint32 dst, uint32 src);

       void searchRandom(uint16 seq, uint32 src);

       void searchUIN(uint16 seq, uint32 dst, uint32 src);

 

       void addFriendReply(uint16 seq, uint32 dst, uint32 src, uint8 auth);

       void updateContactReply(uint16 seq, uint32 src, uint8 *data, int n);

       void searchUINReply(uint16 seq, uint32 src, uint8 *data, int n);

 

       static bool init();

       static void destroy();

       static Server *getServer(const char *name);

       static Server *createServer(const char *name);

       static RemoteSession *getSession(QID &qid);

       static int generateFds(fd_set &readfds, fd_set &writefds);

       static void examineFds(fd_set &readfds, fd_set &writefds);

 

       static ListHead serverList;

 

       char domainName[MAX_DOMAIN_NAME + 1];

       char descName[MAX_DESC_NAME + 1];

       ICQ_STR domain;

       ICQ_STR desc;

 

       uint32 ip;

       int sock;

       int status;

       time_t expire;

       uint32 sessionCount;

       bool isAccepted;

 

       ListHead listItem;

       ListHead hashItem;

 

private:

       bool setDomainAndDesc(ICQ_STR &name, ICQ_STR &des);

 

       RemoteSession *createSession(uint32 uin);

       void notify(uint32 uin, DB_CALLBACK cb);

 

       void createPacket(TcpOutPacket &out, uint16 cmd);

       TcpOutPacket *createPacket(uint16 cmd);

       void sendPacket(TcpOutPacket *out);

       void sendPendingPacket(int s);

 

       void onPacketReceived(TcpInPacket &in);

       void onHello(TcpInPacket &in);

       void onSendMessage(TcpInPacket &in);

       void onAddFriend(TcpInPacket &in);

       void onDelFriend(TcpInPacket &in);

       void onUserOnline(TcpInPacket &in);

       void onUserOffline(TcpInPacket &in);

       void onUserStatus(TcpInPacket &in);

       void onUpdateContact(TcpInPacket &in);

       void onSearchRandom(TcpInPacket &in);

       void onSearchUIN(TcpInPacket&in);

 

       void onHelloReply(TcpInPacket &in);

       void onAddFriendReply(TcpInPacket &in);

       void onUpdateContactReply(TcpInPacket &in);

       void onSearchRandomReply(TcpInPacket &in);

       void onSearchUINReply(TcpInPacket &in);

 

       char buf[TCP_PACKET_SIZE];

       int bufSize;

 

       ListHead uinHash[UIN_HASH_SIZE];

       ListHead sessionList;

       ListHead sendQueue;

 

       DECLARE_SLAB(Server)

};

上面的程序,我不做太多解释,我想大家也应该看得懂,如有疑问可以发表看法,来讨论一下.

H3C设备AAA和RADIUS协议配置

原文地址:http://blog.chinaunix.net/uid-15826553-id-2760564.html?bsh_bid=240863165 一、AAA概述 AAA是Authenti...
  • yshh126
  • yshh126
  • 2015年08月30日 21:17
  • 2069

Redis集群搭建(3主3从)

1. Redis3.0开始支持集群,至少需要6个节点,3个Master,每个Master存在一个Slave从节点。每个Master上存放的数据各不相同,即分布式存储的思想。集群中的每个节点都需要知道集...
  • chenbinqq
  • chenbinqq
  • 2017年12月15日 21:08
  • 189

linux下 c++ 服务器开发(三)

要开始网络编程了, Qt上的客户端(Client)程序就用Qt自带的网络接口(听说可以跨平台),这样的话只要了解Qt网络编程就行了。 服务器(Server)程序是重点,宗旨就是写出服务器程序,让服...
  • qq920020796
  • qq920020796
  • 2016年12月04日 23:41
  • 1189

NOIP圣水题之——三连击

这估计是NOIP里最简单的题了(可以打表好吗?)               -------------------------------------------------------------...
  • qq_33176983
  • qq_33176983
  • 2016年08月11日 22:31
  • 638

如何制作微课视频?使用NN三分屏软件3步完成

想发布微课视频?推荐一款最简单实用的NN三分屏录制软件。插上摄像头,导入PPT,点击录制,三步即可生成微课视频文件。操作简单,可选择模版输出不同的效果。支持直接录制成mp4,flv或网页格式文件。...
  • Ensue
  • Ensue
  • 2017年04月21日 15:18
  • 1331

If-else 三目运算符 底层实现 效率差异

读完文章后自己的一个小结: 在没有编译器优化的情况下三目运算符比If-else快,因为三目运算符还会使用额外的临时变量,它先运算后复制,If-else是直接赋值,所以速度会快,但是现在的编译器已经会...
  • cFarmerReally
  • cFarmerReally
  • 2017年01月17日 15:57
  • 2493

js中的三目运算符详解

判断javascript中的三目运算符用作判断时,基本语法为expression ? sentence1 : sentence2 当expression的值为真时执行sentence1,否则执行...
  • sysuzhyupeng
  • sysuzhyupeng
  • 2017年02月08日 22:56
  • 14585

配电自动化“三遥”具体指什么?

1、“三遥”定义: 遥信:应用通信技术,完成对设备状态信息的监视,如告警状态或开关位置、阀门位置等。开关量信号输入(DI) 遥测:应用通信技术,传输被测变量的测量值。模拟量信号输入(AI) 遥控...
  • Dallin0408
  • Dallin0408
  • 2016年11月10日 15:38
  • 2959

JAVA 基础语法(三)——三目(条件)运算符以及分支语句

三目(条件)运算符以及分支语句 三目运算符 分支语句 if if…else if…else if switch 三目(条件)运算符1)语法结构(boolean表达式)?(表达式1):(表达式2) 2...
  • qq_34598667
  • qq_34598667
  • 2017年06月07日 11:15
  • 422

JavaScript 之条件(三目)运算符

条件运算符 条件运算符是 ECMAScript 中功能最多的运算符,它的形式与 Java 中的相同。 variable = boolean_expression ? true_value : fa...
  • yuanmei1986
  • yuanmei1986
  • 2015年12月28日 20:07
  • 18149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:myicq1.0a1服务器代码分析(三)服务器集群
举报原因:
原因补充:

(最多只允许输入30个字)