- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- 在PACKET TRACER 5.3配置 静态及默认路由.doc
- 数据分析——Packet Sniffer.doc
- 子网划分路由配置.doc
- 实验三Packet Tracer基本命令.doc
- 2、使用网络模拟器Packettracer.doc
- 3.3.3.3 Packet Tracer - Explore a Network 探索网络.docx
- 6.4.1.2 Packet Tracer - Configure Initial Router Settings 配置初始路由器设置.docx
- Packet Tracer 5——4STP生成树协议.doc
- Packet Tracer 5——8配置动态路由RIP.doc
- Packeteer带宽管理解决方案白皮书.doc
原创力文档


文档评论(0)