myicq1.0服务器代码分析一 整体的构架.docVIP

myicq1.0服务器代码分析一 整体的构架.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
myicq1.0服务器代码分析一 整体的构架

myicq代码的公布已经有一段时间了,听说作者张勇已经不再公开的服务器端的代码了,不尤觉得可惜,拜读他的作品已经有一段时间了,今天来发表一下自己的意见。 我现在就从整体的构架来谈谈他服务器端的代码,服务器代码可分成数据库、upd服务、服务器群组、插件四块。 我这里对upd服务的实现进行一些讨论, 一、数据缓冲包的类管理 先定义了抽象类OutPacket与InPacket,代码如下: class OutPacket { public: virtual OutPacket operator (uint8 b) = 0; virtual OutPacket operator (uint16 w) = 0; virtual OutPacket operator (uint32 dw) = 0; virtual OutPacket operator (ICQ_STR str) = 0; }; ? ? class InPacket { public: virtual InPacket operator (uint8 b) = 0; virtual InPacket operator (uint16 w) = 0; virtual InPacket operator (uint32 dw) = 0; virtual InPacket operator (ICQ_STR str) = 0; }; 在实现其派生类IcqOutPacket与IcqInPacket,并定义数据缓冲区uint8 data[UDP_PACKET_SIZE],大小为1024,主要是处理数据的输入与输出。 再派生其类UdpOutPacket与UdpInPacket,此时进行了DES的数据加密与解密的处理,并加入数据头,定义如下: struct UDP_CLI_HDR { uint16 ver; uint32 reserved; uint32 uin; uint32 sid; uint16 cmd; uint16 seq; uint16 cc; // check code }; ? struct UDP_SRV_HDR { uint16 ver; uint32 reserved; uint32 uin; uint32 sid; uint16 cmd; uint16 seq; uint16 ackseq; }; 此时缓冲区的包类已经结束。 二、socket服务代码的编写 先定义2个类RefObject与 Session,其中RefObject为记数类,两代码如下: class RefObject { public: RefObject() { refCount = 1; } ? int addRef() { return ++refCount; } int release() { register int ret = --refCount; if (!ret) delete this; return ret; } ? protected: virtual ~RefObject() {} ? int refCount; }; class Session { public: uint32 uin; uint32 status; uint32 ip; uint16 msgport; uint32 realip; }; 现在我们来看一下udp服务类的定义 class UdpSession : public RefObject, public Session { public: UdpSession(UdpInPacket in, uint32 ip, uint16 port); ~UdpSession(); ? UdpOutPacket *createPacket(uint16 cmd, uint16 ackseq = 0); void sendPacket(UdpOutPacket *p); ? void sendOnline(Session *s, ICQ_STR domain); void sendOffline(uint32 uin, ICQ_STR domain); void sendStatusChanged(Session *s, ICQ_STR domain); void sendMessage(uint8 type, QID src, uint32 when, ICQ_STR text); void sendGroupTypes(); void updateContactReply(uint16 seq, uint8 *data, int n, Ser

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档