多年前一个机会参与设计开发一个企业级的即时通讯软件项目,当时类似企业QQ,阿里旺旺的软件系统,如今整理资料时觉得可以将它拿出来与大家分享,不过是早期的一个版本,如今经过我的努力已经更新了多个版本,现在还是比较不错的,可以商用,想学习这方面的朋友可以免费下载源码包,但是不能用于商用,如今已经有C++\C#\Delphi等多个版本,想购买商用版可以联系我,ok!废话不多说先上内容。

一.系统功能清单概览

功能模块

功能模块具体描述

 

 

 

 

 

 

 

 

实时信息交互

支持联系人状态(在线、离开、离线、忙碌、电话、会议…)

支持一对一会话(文字)

支持邀请多人会话(文字)

支持表情图标

支持字体与颜色

支持截图发送

支持点对点文件发送

支持点对点文件断点续传

支持一对一语音交流

支持一对一视频交流

查找联系人

显示在线企业内部人员与客户联系人

支持消息广播

支持留言消息提醒,对方不在线情况下可以留言,对方上线时得到留言提醒

 

 

企业组织结构管理

支持企业部门结构浏览,可查看部门结构以及找到具体的部门人员或客户联系人

支持企业部门组织结构信息创建与修改

支持部门下面人员信息(帐号)创建与修改

支持企业客户联系人信息(帐号)创建与修改

历史信息管理

通讯记录,查看历史聊天记录和文件发送接收记录

 

企业短信中心

一对一手机短信发送(中国移动、中国联通手机)

手机短信群发(中国移动、中国联通手机)

Web客户端

内嵌Web网页浏览

语言版本

支持简体中文操作界面,包括客户端和服务端

支持英文操作界面,包括客户端和服务端

二、具体功能:

系统设置

用户对客户端登录连接等信息进行设置,如图(2)、(3)所示

注销

表示用户退出重新登录系统

查看详细资料

表示对联系人的详细信息进行查看

我的状态

表示用户可以自定义在线状态,如忙碌、离开、就餐…

开始对话

表示进入即时信息交流

发送文件或照片

表示发送文件和图片给对方,文件格式没有限制可以是任何文件,另外传输文件大小也没有限制

音频对话

表示用户一对一使用麦克风进行语音交流

网络摄像机

表示用户一对一使用麦克风和摄像头进行语音视频交流

音频视频调节向导

表示用户对即插即用的音频视频设备进行设置

打开消息历史记录

表示用户查看自己历史聊天记录和文件收发记录

三、截图

用户上线

1)      0x1001:Client连接Appsvr,发送上线请求,包格式如下:

字段名

长度(字节数)

类型

备注

用户名UserName

31

char

密码Password

16

char

版本号

4

int

好友列表最后刷新时间

4

Time_t

如果版本不匹配,连接到文件服务器下载最新版本的安装程序,断开客户端连接;

0x5001:Appsvr收到请求后作版本比较,如果版本更新,则通知Client

字段名

长度

类型

备注

文件服务器IP

16

char

文件服务器端口

2

byte

版本号

4

int

如果AppSvr中的待处理登录命令太多,则直接拒绝客户端登录请求

0x5001     AppSvr->Client

字段名

长度(字节数)

类型

备注

状态码:

0x5001    版本不匹配

0x5002    服务器忙

2)      0x5002: Appsvr向DBGateway请求验证;

字段名

长度

类型

备注

源消息ID

4

int

AppSvr发给MCG的消息ID

用户名UserName

31

char

密码Password

16

char

好友列表最后刷新时间

4

Time_t

3)      数据库网关返回验证结果

如果验证客户端失败,返回空包

0x7001:DBG->Appsvr

字段名称

长度

类型

备注

状态码:

0x7001  用户密码错

0x7002    用户不存在

 

如果验证客户端成功,返回用户个人信息和好友列表

0x7001  DBG->AppSvr

字段名称

长度

类型

备注

源消息ID

4

int

AppSvr发给MCG的消息ID

用户ID

4

int

性别

1

Byte

0:无,1:男,2:女

年龄

1

Byte

加好友方式

1

byte

0:直接加,1:验证,2:禁止加

图标ID

2

byte

昵称

51

Char

手机

20

Char

Email地址

51

Char

公司

31

Char

部门

21

char

国家

31

char

省份

31

char

城市

31

char

地址

51

char

是否需要更新本地好友列表

1

byte

0:不需要更新;1:必须更新

是否有加好友验证消息需反馈

1

byte

0:没有;1:有

加过本方的人的个数

2

WORD

好友个数

2

WORD

加过本方为好友的人的列表

用户号UserID

4

Int

好友列表

好友UserID

4

Int

好友用户名

图标ID

2

Int

昵称DispName

51

Char

状态码:0x0000    验证成功

4)     AppSvr向Client回复登录验证结果

如果验证客户端失败,AppSvr向客户端回复失败状态,并断开客户端连接

0x5001 AppSvr->Client

字段名称

长度

类型

备注

状态码:      0x7001    用户不存在

0x7002    用户密码错误

如果验证成功,返回用户个人信息和好友列表以及所负载的IMSvr,然后断开客户端连接

0x5001: Appsvr->Client:通知客户端验证成功,返回用户个人信息和IMSvr列表

字段名

长度

类型

备注

用户ID

4

int

性别

1

Byte

0:无,1:男,2:女

年龄

1

Byte

加好友方式

1

byte

0:直接加,1:验证,2:禁止加

图标ID

2

byte

昵称

51

Char

手机

20

Char

Email地址

51

Char

公司

31

Char

部门

21

char

国家

31

char

省份

31

char

城市

31

char

地址

51

char

IMSvr个数

1

byte

IMSvr列表

IMSvr IP

16

Char

IMSvr TCP端口

2

Short

IMSvr UDP端口

2

Short

状态码:0x0000    验证成功

0x5003:Appsvr->Client    刷新好友信息

字段名

长度

类型

备注

是否需要更新本地好友列表

1

byte

0:不需要更新;1:必须更新

好友个数

好友列表

好友UserID

4

Int

用户名

31

char

昵称DispName

51

Char

图标ID

2

Int

状态

状态码:0x0000    成功

5)      0x1002:Client_IMSVR_TCP_online:Client->IMSvr:客户端登录IM服务器

字段名

长度

类型

备注

用户号UserID

4

Int

密码Password

16

Char

内网IP

16

char

内网UDP 端口

2

short

6)      0xB001      IMSvr->AppSvr 请求验证客户端

字段名

长度

类型

备注

用户号UserID

4

Int

密码Password

16

Char

 

7)      0x5004 AppSvr->IMSvr 返回验证结果

字段名

长度

类型

备注

用户号UserID

4

Int

状态码:  0x0000    验证成功

0x5003    用户不存在

0x5004    用户密码错误

8)      0xB002 IMSvr->Client 返回验证结果

字段名

长度

类型

备注

状态码:  0x0000    验证成功

0x5003    用户不存在

0x5004    用户密码错误

IMSvr向客户端返回验证成功的结果后,在待处理队列中写入一个包,记录开始等候UDP连接的时间,作超时检测。Client收到验证成功的消息后,开始向IMSvr发UDP激活包;

UDP激活包的格式如下:

0x1000:

字段名

长度

类型

备注

用户号UserID

4

Int

如果IMSvr超时未收到客户端的UDP激活包,则通知Client登录失败,断开连接;如果成功收到激活包,则通客户端登录成功。同时IMSvr通知AppSvr,Client登录是否成功。

9)      0xB003 IMSvr->Client IM服务器通知客户端登录结果

字段名

长度

类型

备注

状态码:  0x0000    登录成功

0xB001   超时未收到UDP激活包

0xB002   服务器超时

0xB003  服务器忙

0xB004   服务器拒绝登录请求

0x5003    用户不存在

0x5004    用户密码错误

0xB004

IMSvr->AppSvr:Client上线是否成功

字段名

长度

类型

备注

用户号UserID

4

Int

外网IP

16

char

外网udp端口

2

byte

内网IP

16

char

内网udp端口

2

byte

状态码:  0x0000    登录成功

其它:   登录失败

10)   AppSvr的处理

如果AppSvr收到IMSvr发送的客户端登录成功的消息,则(1)更改用户结点的状态;(2)通知数据库网关更改数据库中记录的状态;(3)返回用户的在线好友列表给IMSvr;(4)通知加过该用户的所有在线好友所在的IMSvr,有人上线。

0x5005 :App->DBGateway:向数据库写用户在线信息

字段名

长度

类型

备注

用户号UserID

4

Int

外网IP

16

char

外网udp端口

2

Short

内网IP

16

Char

内网udp端口

2

short

登录状态

1

Byte

0x5006:Appsvr->IMSvr: 刷在线好友信息(包括加我为好友的人的信息)

字段名

长度

类型

备注

用户ID

4

int

在线好友个数

2

short

在线好友列表

在线好友UserID

4

Int

用户名

31

char

昵称

51

char

图标ID

2

short

IMSvr的IP

16

char

外网IP

16

char

外网UDP端口

2

Byte

内网IP

16

char

内网UDP端口

2

byte

在线状态

1

Byte

好友类型

1

byte

1:我的好友;2:加过我的人

0xB013 IMerver ->IMClient  刷在线好友信息(包括加我为好友的人的信息)

字段名

长度

类型

备注

在线好友个数

2

short

在线好友列表

在线好友UserID

4

Int

用户名

31

char

昵称

51

char

图标ID

2

short

IMSvr的IP

16

char

外网IP

16

char

外网UDP端口

2

Byte

内网IP

16

char

内网UDP端口

2

byte

在线状态

1

Byte

好友类型

1

byte

1:我的好友;2:加过我的人

0x5007:App->IMSvrx: 通知加过我为好友的人,有人上线

字段名

长度

类型

备注

用户号UserID

4

Int

用户名

31

char

昵称DispName

51

Char

图标ID

2

Int

IMSvr的IP

16

Char

外网IP

16

Char

外网UDP端口

2

Byte

内网IP

16

char

内网UDP端口

2

byte

在线状态

1

Byte

好友类型

1

byte

1:我的好友;2:加过我的人

好友个数

2

short

好友ID列表

11)    0xB005  IMSvrx->Clientx: IMSvrx通知每个在线好友,有人上线

字段名

长度

类型

备注

用户号UserID

4

Int

用户名

31

char

昵称DispName

51

Char

图标ID

2

Int

IMSvr的IP

16

char

外网IP

16

char

外网UDP端口

2

Byte

内网IP

16

char

内网UDP端口

2

byte

在线状态

1

Byte

好友类型

1

byte

1:我的好友;2:加过我的人

流程图:

用户下线

用户主动下线

1) 0x1003:Client_IMSvr_Offline:Client->IMSvr:Client向IM服务器发送下线请求

字段名

长度

类型

备注

2) 0xB006  IMSvr->Appsvr:IMSvr向应用服务器发送用户下线通知

字段名

长度

类型

备注

用户号UserID

30

char

3) 0x5008:Appsvr->DBGateway:通知用户下线. 

字段名

长度

类型

备注

用户号UserID

4

int

0x5009:Appsvr->IMSvrx:应用服务器发送用户下线通知给该用户的所有在线好友所在的IMSvrx,

字段名

长度

类型

备注

下线用户号UserID

4

Int

好友用户号ID列表

4

int

4) :0xB007  IMSvrx->Clientx   IMSvr通知客户端,有好友下线

字段名

长度

类型

备注

下线用户号UserID

4

int

用户主动下线流程图:

用户超时下线

客户端定时向IM服务器发送心跳包,如果IM服务器超时未收到客户端的心跳包,则认为用户下线

处理过程同“用户主动下线”的2)——4)步

加好友

1)       0x1010:Client->IMSvr :客户端向IMSVR查询指定用户的信息  发送加好友请求

字段名

长度

类型

备注

本方用户号UserID

4

int

对方用户名UserName

31

Char

2)      :0xB008 IMSvr->Appsvr:IMSvr向应用服务器转发加好友的请求

字段名

长度

类型

备注

本方用户号UserID

4

int

对方用户名UserName

31

char

3)       0x500A:Appsvr->DBGateway:应用服务器向数据库网关转发加好友的请求

字段名

长度

类型

备注

SourceID

4

Int

源ID

本方用户号UserID

4

int

对方用户名UserName

31

char

4)       0x7002:DBGateway->Appsvr:数据库网关向应用服务器应答加好友的结果

如果添加成功,返回被加用户的个人详细信息

字段名

长度

类型

备注

SourceID

4

int

源ID

本方用户号UserID

4

Int

对方用户名UserName

31

char

以下为被加方的个人详细信息

用户ID

4

int

昵称

51

char

图标ID

2

byte

性别

1

Byte

省份

31

char

年龄

1

byte

对方状态

1

byte

状态码:      0x0000    添加成功

如果添加失败,返回错误码

字段名

长度

类型

备注

SourceID

4

int

源ID

本方用户号UserID

4

int

对方用户名UserName

31

char

 

状态码:

其它:   添加失败

5)       0x500B: AppSvr->IMSvr:应用服务器向IM服务器转发加好友的结果

字段名

长度

类型

备注

本方用户号UserID

4

Int

对方用户名UserName

31

char

以下为被加方的个人详细信息

用户ID

4

int

昵称

51

char

图标ID

2

byte

性别

1

Byte

省份

10

char

年龄

1

byte

对方状态

1

byte

状态码:      0x0000    添加成功

如果添加失败,返回错误码

字段名

长度

类型

备注

本方用户号UserID

4

int

对方用户名UserName

31

char

状态码:

其它:   添加失败

6)       0xB009 IMSvr->Client:IM服务器向客户端转发加好友的结果

包格式同5)

直接加好友的流程图:

删除好友

1)       0x1011:Client->IMSvr 客户端发送请求删除好友的命令

字段名

长度

类型

备注

本方UserID

4

int

被删用户号

4

Int

2)       0xB00A  IMSvr->AppsvrIM服务器向应用服务器转发用户删除好友的命令

字段名

长度

类型

备注

本方UserID

4

int

被删用户号

4

Int

3)       0x500C :Appsvr->DBGateway应用服务器向数据库网关转发用户删除好友的命令

字段名

长度

类型

备注

SourceID

4

Int

本方UserID

4

int

被删用户号

4

Int

 

4)       0x7003:DBGateway->AppSvr数据库网关回复用户删除好友的结果

字段名

长度

类型

备注

SourceID

4

int

本方UserID

4

int

被删用户号

4

Int

状态码:  0x0000    成功

其它:   删除失败

 

 

5)       0x500D:AppSvr->IMSvr应用服务器向IM服务器转发用户删除好友的结果

字段名

长度

类型

备注

本方UserID

4

int

被删用户号

4

Int

状态码:  0x0000    成功

其它:   删除失败

 

6)       :0xB00B  IMSvr->ClientIM服务器向客户端转发删除好友的结果

字段名

长度

类型

备注

本方UserID

4

int

被删用户号

4

Int

状态码:  0x0000    成功

其它:   删除失败

 

修改用户信息

1)       0x1020Client->IMSVR客户端请求修改个人信息

字段名

长度

类型

备注

UserID

4

Int

密码Password

16

char

昵称

51

Char

2)       0xB00C: IMSvr->AppSvr IM服务器转发用户修改个人信息的命令

字段名

长度

类型

备注

UserID

4

int

昵称

51

char

3)       0x500E:Appsvr->DBGateway 应用服务器转发用户修改个人信息的命令

字段名

长度

类型

备注

SourceID

4

int

UserID

4

Int

昵称

4)       0x7004: DBGateway->Appsvr 数据库网关回复用户修改个人信息的结果

字段名

长度

类型

备注

SourceID

4

int

UserID

4

Int

状态码:  0x0000    成功

其它:   修改失败

5)       0x500F:Appsvr->IMSvr 应用服务器转发用户修改个人信息的结果

字段名

长度

类型

备注

UserID

4

Int

状态码:  0x0000    成功

其它:   修改失败

6)       0xB00D:IMSvr->Client  IM服务器转发用户修改个人信息的结果

字段名

长度

类型

备注

UserID

4

Int

状态码:  0x0000    成功

其它:   修改失败

查询用户详细信息

1)       0x1021:Client->IMSVR客户端请求查询用户详细信息

字段名

长度

类型

备注

UserID

4

Int

对方UserID

4

int

2)       0xB00E: IMSvr->AppSvr IM服务器转发查询用户详细信息的命令

字段名

长度

类型

备注

UserID

4

int

对方UserID

3)       0x5010: Appsvr->DBGateway 应用服务器转发查询用户详细信息的命令

字段名

长度

类型

备注

SourceID

4

int

UserID

4

Int

对方UserID

4

int

4)       0x7005: DBGateway->Appsvr 数据库网关回复查询用户详细信息的结果

成功返回用户详细信息:

字段名

长度

类型

备注

SourceID

4

int

UserID

4

Int

对方UserID

用户名

31

Char

昵称

51

char

图标ID

状态码:  0x0000    成功

失败返回:

字段名

长度

类型

备注

SourceID

4

int

UserID

4

Int

对方UserID

状态码:  0x7002    用户不存在

其它:   查询失败

5)       0x5011: Appsvr->IMSvr 应用服务器转发查询用户详细信息的结果

成功返回:

字段名

长度

类型

备注

UserID

4

Int

对方UserID

用户名

31

Char

昵称

51

char

图标ID

状态码:      0x0000    成功

失败返回:

字段名

长度

类型

备注

UserID

4

Int

对方UserID

状态码:

0x7002    用户不存在

其它:   查询失败

6)       0xB00F IMSvr->Client IM服务器转发查询用户详细信息的结果

成功返回:

字段名

长度

类型

备注

UserID

4

Int

对方UserID

用户名

31

Char

昵称

51

char

图标ID

状态码:  0x0000    成功

失败返回:

字段名

长度

类型

备注

UserID

4

Int

对方UserID

状态码:

0x7002    用户不存在

其它:   查询失败

转发命令

 

在客户端、IM服务器、应用服务器之间直接转发从一个Client到另一个Client的即时消息

1)       0x1FFF:Client->IMSvr

字段名

长度

类型

备注

源UserID

4

int

目的UserID

4

Int

命令包内容

2)       0x1FFF:IMSvr->Appsvr

字段名

长度

类型

备注

源UserID

4

int

目的UserID

4

Int

命令包内容

 

3)       0x1FFF:AppSvr->IMSvr

字段名

长度

类型

备注

源UserID

4

int

目的UserID

4

Int

命令包内容

 

4)       0x1FFF:IMSvr->Client IM

字段名

长度

类型

备注

源UserID

4

int

目的UserID

4

Int

命令包内容

 

IMServer上线

0xB010  IMServer->AppServer IMServer启动时向Appserver验证

字段名

长度

类型

备注

密码

16

Char

TCP端口

4

Int

UDP端口

4

Int

 

0x5012   AppSvr->DBGateway        请求数据库网关验证IM服务器

字段名

长度

类型

备注

源ID

4

int

IM服务器IP

16

char

密码

16

Char

 

0x7006   DBGateway->AppSvr        数据库网关返回验证IM服务器的结果

字段名

长度

类型

备注

源ID

4

int

IMSvrID

4

int

状态码:0x0000   验证成功

0x7010  没有注册的IMServer

0x7011      注册密码错误

 

 

0x5100:AppServer->IMserver     Appserver返回验证结果

字段名

长度

类型

备注

状态码:0x0000   验证成功

0x7010  没有注册的IMServer

0x7011      注册密码错误

IMServer下线

0xB011IMServer->AppServer 通知Appserver本地IMserver即将关闭

字段名

长度

类型

备注

0x5013   AppSvr->DBGateway        向数据库网关发送IM服务器下线命令

字段名

长度

类型

备注

IMSvrD

4

int

IMServer心跳包

0xB012IMServer->AppServer

字段名

长度

类型

备注

 这里将基础的IMDefine代码贴出来。

#ifndef IMSERVER_DEF_H
#define IMSERVER_DEF_H
#define IMSERVER_CMD_BASE 0xB000
#define IMSERVER_ERROR_BASE 0xB000
#define IM_CMD_BASE 0x1000
#define IM_ERROR_BASE 0x1000
#define APPSERVER_CMD_BASE 0x5000
#define APPSERVER_ERROR_BASE 0x5000
#define DBSERVER_CMD_BASE 0x7000
#define DBSERVER_ERROR_BASE 0x7000
#define MAX_PASSWORD 15
#define MAX_IPADDRESS 15
#define MAX_USERNAME 30
#define MAX_GROUPNAME 30
#define MAX_NICKNAME 50
#define MAX_ADDRESS 50
#define MAX_PHOTONUBMER 19
#define MAX_EMAIL 50
#define MAX_COMPANY 30
#define MAX_DEPT 20
#define MAX_COUNTRY 30
#define MAX_PROVINCE 30
#define MAX_CITY 30
#define RESULT_NOERROR 0
#define GROUPID_NONE (DWORD)-1

#pragma pack(1)
#ifndef ___DEFINE_H___
typedef struct
{
//#ifndef __IO_COMPLETE_PORT__
//WORD wLen;
//#endif
WORD wCommandID; //命令ID
WORD wResult;//结果
}
PACKETHEADER, *PPACKETHEADER;
#endif

//个人基础信息
typedef struct
{
UINT nUserID;//用户ID
CHAR strUserName[MAX_USERNAME + 1];// 用户名
BYTE bSex;//  性别 0:无,1:男,2:女
BYTE bAge;//  年龄
BYTE bAddType;// 加好友方式1 byte 0:直接加,1:验证,2:禁止加
BYTE bPicture;// 图标ID
CHAR strNickName[MAX_NICKNAME + 1];// 昵称
CHAR strMobile[MAX_PHOTONUBMER + 1]; //手机
CHAR strEmail[MAX_EMAIL + 1];// Email地址
CHAR strCompany[MAX_COMPANY + 1];// 公司
CHAR strDept[MAX_DEPT + 1];// 部门
CHAR strCountry[MAX_COUNTRY];// 国家
CHAR strProvince[MAX_PROVINCE + 1];// 省份
CHAR strCity[MAX_CITY + 1];// 城市
CHAR strAddress[MAX_ADDRESS + 1];// 地址
} IMPERSON_BASE_INFO;

//好友基础信息
typedef struct
{
UINT nUserID;
CHAR strUserName[MAX_USERNAME + 1];
CHAR strNickName[MAX_NICKNAME + 1];// 昵称
BYTE bPicture;// 图标ID
UINT nGroupID;// 组ID
} IMBUDDY_BASE_INFO;

// 用户组信息
typedef struct
{
UINT nGroupID;
CHAR strGroupName[MAX_GROUPNAME + 1];
} IMGROUP_BASE_INFO;

//在线好友基础信息
typedef struct
{
UINT nUserID;
CHAR strUserName[MAX_USERNAME + 1];
CHAR strNickName[MAX_NICKNAME + 1];// 昵称
BYTE bPicture;// 图标ID
CHAR strIMServerIP[MAX_IPADDRESS + 1];
CHAR strNatIP[MAX_IPADDRESS + 1];
WORD wNatPort;
CHAR strLocalIP[MAX_IPADDRESS + 1];
WORD wLocalPort;
BYTE bOnlineStatus;
BYTE bBuddyType;
} IMBUDDY_ONLINE_INFO;

//IMSERVER信息
typedef struct
{
CHAR strIP[MAX_IPADDRESS + 1];
SHORT nTcpPort;
SHORT nUdpPort;
} IMSERVER_BASE_INFO;

//加好友基础信息
typedef struct
{
UINT nUserID;
CHAR strNickName[MAX_NICKNAME + 1];// 昵称
BYTE bPicture;// 图标ID
BYTE bSex;//  性别 0:无,1:男,2:女
CHAR strProvince[MAX_PROVINCE + 1];// 省份
BYTE bAge;//  年龄
BYTE bState;
} IMBUDDY_ADD_INFO;

//Common
#define IM_SWITCH_COMMAND 0x1FFFF
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nDestID;
CHAR pData[1];
} STRUCT_IM_SWITCH;

///From IMClient/
//登录Appserver
#define IMCLIENT_LOGIN IM_CMD_BASE + 0x0001
typedef struct
{
PACKETHEADER Head;
CHAR strUserName[MAX_USERNAME + 1];
CHAR strPassword[MAX_PASSWORD + 1];
DWORD dwVersion;
time_t tLastUpdate;
} STRUCT_IMCLIENT_LOGIN;

//用户登录状态
enum EClientLoginStatus{
eClientLoginStatusOffline = 1,//离线
eClientLoginStatusLogining,//正在登录
eClientLoginStatusOnline//在线
};

//用户在线状态
enum EClientOnlineStatus{
eClientOnlineStatusOffline = 1,
eClientOnlineStatusOnline,//在线
eClientOnlineStatusBusy,//忙
eClientOnlineStatusHide,//隐身
eClientOnlineStatusLeave,//离开
eClientOnlineStatustelephone,//电话中
eClientOnlineStatusComeBackSoon,//马上回来
eClientOnlineStatusDinner,//外出就餐
eClientOnlineStatusShowOffline//显示为脱机
};

//登录IMserver
#define IMCLIENT_ONLINE IM_CMD_BASE + 0x0002
typedef struct
{
PACKETHEADER Head;
DWORD dwSessionID;
UINT nUserID;
CHAR strPassword[MAX_PASSWORD + 1];
CHAR strLocalIP[MAX_IPADDRESS + 1];
SHORT nLocalPort;
} STRUCT_IMCLIENT_ONLINE;

//下线
#define IMCLIENT_OFFLINE IM_CMD_BASE + 0x0003
typedef PACKETHEADER STRUCT_IMCLIENT_OFFLINE;

//加好友
#define IMCLIENT_ADDBUDDY IM_CMD_BASE + 0x0010
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
CHAR strAddUserName[MAX_USERNAME + 1];
} STRUCT_IMCLEINT_ADDBUDDY;

//删除好友
#define IMCLIENT_DELBUDDY IM_CMD_BASE + 0x0011
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nDelUserID;
} STRUCT_IMCLEINT_DELBUDDY;

//加组 ->imserver
#define IMCLIENT_ADDGROUP IM_CMD_BASE + 0x0012
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
CHAR strGroupName[MAX_GROUPNAME + 1];
} STRUCT_IMCLEINT_ADDGROUP;

//删组 ->imserver
#define IMCLIENT_DELGROUP IM_CMD_BASE + 0x0013
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
} STRUCT_IMCLEINT_DELGROUP;

//修改用户的组属性 ->IMServer

#define IMCLIENT_EDITUSERGROUP IM_CMD_BASE +0x0014
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nBuddyID;
UINT nGroupID;
} STRUCT_IMCLEINT_EDITUSERGROUP;
//修改组名称
#define IMCLIENT_RENAMEGROUP  IM_CMD_BASE +0x0015
typedef struct  {
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
CHAR strNewGroupName[MAX_GROUPNAME + 1];
}STRUCT_IMCLIENT_RENAMEGROUP;

//修改信息
#define IMCLIENT_EDITINFO IM_CMD_BASE + 0x0020
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
CHAR strOldPassword[MAX_PASSWORD + 1];
CHAR strNewPassword[MAX_PASSWORD + 1];
CHAR strNickName[MAX_NICKNAME + 1];
} STRUCT_IMCLEINT_EDITINFO;

//查询好友信息
#define IMCLIENT_QUERYINFO IM_CMD_BASE + 0x0021
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nQueryUserID;
} STRUCT_IMCLEINT_QUERYINFO;

//TCP激活包
#define IMCLIENT_TCPACTIVE IM_CMD_BASE + 0x0030
typedef struct
{
PACKETHEADER Header;
} STRUCT_IMCLEINT_TCPACTIVE;

//UDP激活包
#define IMCLIENT_UDPACTIVE IM_CMD_BASE + 0x0031
typedef struct
{
PACKETHEADER Header;
DWORD dwSessionID;
UINT nUserID;
} STRUCT_IMCLEINT_UDPACTIVE;

//更改用户状态
#define IMCLIENT_CHANGE_STATUS IM_CMD_BASE +0x00A0
typedef struct 
{
PACKETHEADER Header;
UINT nUserID;
BYTE eStatus;
}STRUCT_IMCLIENT_CHANGE_STATUS;

From IMServer//
//到AppServer认证用户
#define IMSERVER_AUTHUSER IMSERVER_CMD_BASE +0x0001
typedef struct
{
PACKETHEADER Head;
DWORD dwSessionID;
UINT nUserID;
CHAR strPassword[MAX_PASSWORD + 1];
} STRUCT_IMSERVER_AUTHUSER;

//认证结果
#define IMSERVER_AUTHRESULT IMSERVER_CMD_BASE +0x0002
typedef struct
{
PACKETHEADER Head;
} STRUCT_IMSERVER_AUTHRESULT;

//上线结果,通知ImClient
#define IMSERVER_ONLINERESP IMSERVER_CMD_BASE +0x0003

typedef struct
{
PACKETHEADER Head;
CHAR strNatIP[MAX_IPADDRESS + 1];
SHORT nNatPort;//网络字节
}STRUCT_IMSERVER_ONLINERESP;

/*
0x0000 登录成功
0xB001 超时未收到UDP激活包
0xB002 服务器超时
0xB003  服务器忙
0xB004 服务器拒绝登录请求
0x5003 用户不存在
0x5004 用户密码错误
*/
enum
{
RESULT_ONLINE_OK= RESULT_NOERROR,
RESULT_ONLINE_UDPTIMEOUT= IMSERVER_ERROR_BASE+0x0001, //超时未收到UDP激活包
RESULT_ONLINE_AUTHTIMEOUT,//认证超时
RESULT_ONLINE_BUSY,// 服务器忙
RESULT_ONLINE_REFUSE,//服务器拒绝登录请求
//RESULT_USERAUTH_PASSWORD
//RESULT_USERAUTH_NOEXIT
};

//上线结果,通知AppServer
#define IMSERVER_USERONLINE IMSERVER_CMD_BASE +0x0004
typedef struct
{
PACKETHEADER Header;
DWORD dwSessionID;
UINT nUserID;
CHAR m_strLocalIP[MAX_IPADDRESS + 1];
SHORT m_nLocalPort;
CHAR m_strNatIP[MAX_IPADDRESS + 1];
SHORT m_nNatPort;
} STRUCT_IMSERVER_USERONLINE;

//好友上线通知,通知IM Client
#define IMSERVER_NOTIFYONLINE IMSERVER_CMD_BASE+ 0x0005
typedef struct
{
PACKETHEADER Header;
IMBUDDY_ONLINE_INFO OnlineBuddy;
} STRUCT_IMSERVER_NOTIFYONLINE;

//下线结果,通知AppServer
#define IMSERVER_USEROFFLINE IMSERVER_CMD_BASE +0x0006
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
} STRUCT_IMSERVER_USEROFFLINE;

//好友下线通知,通知IM Client
#define IMSERVER_NOTIFYOFFLINE IMSERVER_CMD_BASE+ 0x0007
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
} STRUCT_IMSERVER_NOTIFYOFFLINE;

//转发加好友 ->appserver
#define IMSERVER_ADDBUDDY IMSERVER_CMD_BASE +0x0008
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
CHAR strAddUserName[MAX_USERNAME + 1];
} STRUCT_IMSERVER_ADDBUDDY;

//转发加好友结果   ->imclient
//此包为不定长包,注意判断
#define IMSERVER_ADDBUDDYRESP IMSERVER_CMD_BASE+ 0x0009
typedef struct
{
PACKETHEADER Header;
// UINT nUserID;
CHAR strUserName[MAX_USERNAME + 1];
IMBUDDY_ADD_INFOBuddyInfo;
} STRUCT_IMSERVER_ADDBUDDYRESP;

//IMserver->Appserver,删除好友
#define IMSERVER_DELBUDDY IMSERVER_CMD_BASE +0x000A
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
UINT nDelUserID;
} STRUCT_IMSERVER_DELBUDDY;

//Imserver->imclient,删除好友结果
#define IMSERVER_DELBUDDYRESP IMSERVER_CMD_BASE+ 0x000B
typedef struct
{
PACKETHEADER Header;
UINT nDelUserID;
} STRUCT_IMSERVER_DELBUDDYRESP;

//修改用户信息
#define IMSERVER_EDITINFO IMSERVER_CMD_BASE +0x000C
typedef struct
{
PACKETHEADER Header;
CHAR strPassword[MAX_PASSWORD + 1];
IMPERSON_BASE_INFOUserInfo;
} STRUCT_IMSERVER_EDITINFO;

///修改用户信息结果
#define IMSERVER_EDITINFORESP IMSERVER_CMD_BASE+ 0x000D
typedef struct
{
PACKETHEADER Header;
CHAR strPassword[MAX_PASSWORD + 1];
IMPERSON_BASE_INFOUserInfo;
} STRUCT_IMSERVER_EDITINFORESP;

//查询好友信息imsvr->appsvr
#define IMSERVER_QUERYINFO IMSERVER_CMD_BASE +0x000E
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
UINT nQueryUserID;
} STRUCT_IMSERVER_QUERYINFO;

//查询好友信息结果imsvr->client
#define IMSERVER_QUERYINFORESP IMSERVER_CMD_BASE+ 0x000F

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nQueryUserID;
//如果操作成功
IMPERSON_BASE_INFO UserInfo;//好友的个人详细信息
/*
UINT nQueryUserID;//如果操作成功
CHAR strUserName[MAX_USERNAME + 1];
CHAR strNickName[MAX_NICKNAME + 1];// 昵称
BYTE bPicture;// 图标ID
*/
} STRUCT_IMSERVER_QUERYINFORESP;

//注册到Appserver
#define IMSERVER_REGISTRY IMSERVER_CMD_BASE +0x0010
typedef struct
{
PACKETHEADER Header;
CHAR strPassword[MAX_PASSWORD + 1];
SHORT nTcpPort;
SHORT nUdpPort;
} STRUCT_IMSERVER_REGISTRY;

//从Appserver取消注册
#define IMSERVER_UNREGISTRY IMSERVER_CMD_BASE +0x0011

//心跳包
#define IMSERVER_ACTIVEPACKET IMSERVER_CMD_BASE+ 0x0012

//IMSERVER->IMSClinet,在线好友列表
#define IMSERVER_ONLINEBUDDY IMSERVER_CMD_BASE +0x0013

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
WORD wBuddyCount;//在线好友个数

//此处有wBuddyCount个IMBUDDY_ONLINE_INFO结构
IMBUDDY_ONLINE_INFO OnlineBuddy[1];
} STRUCT_IMSERVER_ONLINEBUDDY;

//IMSERVER->APPSEVER
#define IMSERVER_ADDGROUP IMSERVER_CMD_BASE +0x0014
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
CHAR strGroupName[MAX_GROUPNAME + 1];
} STRUCT_IMSERVER_ADDGROUP;

//IMSERVER->IMCLIENT
#define IMSERVER_ADDGROUPRESP IMSERVER_CMD_BASE+ 0x0015
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
CHAR strGroupName[MAX_GROUPNAME + 1];
UINT nGroupID;//增加失败时无效
} STRUCT_IMSERVER_ADDGROUPRESP;

//IMSERVER->APPSEVER
#define IMSERVER_DELGROUP IMSERVER_CMD_BASE +0x0016
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
} STRUCT_IMSERVER_DELGROUP;

//IMSERVER->IMCLIENT
#define IMSERVER_DELGROUPRESP IMSERVER_CMD_BASE+ 0x0017
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
} STRUCT_IMSERVER_DELGROUPRESP;

//修改用户的组属性 ->Appserver
#define IMSERVER_EDITUSERGROUP  IMSERVER_CMD_BASE + 0x0018
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nBuddyID;
UINT nGroupID;
} STRUCT_IMSERVER_EDITUSERGROUP;

//修改用户的组属性 ->IMClient
#define IMSERVER_EDITUSERGROUPRESPIMSERVER_CMD_BASE + 0x0019
typedef struct
{
PACKETHEADER Head;
UINT nBuddyID;
UINT nGroupID;
} STRUCT_IMSERVER_EDITUSERGROUPRESP;

//组重命名 ->AppServer
#define IMSERVER_RENAMEGROUP IMSERVER_CMD_BASE +0x001A
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
CHAR strNewGroupName[MAX_GROUPNAME + 1];
} STRUCT_IMSERVER_RENAMEGROUP;

//组重命名答复 ->IMClient
#define IMSERVER_RENAMEGROUPRESPIMSERVER_CMD_BASE + 0x001B
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
CHAR strNewGroupName[MAX_GROUPNAME + 1];
} STRUCT_IMSERVER_RENAMEGROUPRESP;

#define IMSERVER_KICKOUTUSER IMSERVER_CMD_BASE +0x001C

//更改用户状态
#define IMSERVER_CHANGE_STATUS IMSERVER_CMD_BASE+ 0x001D
typedef struct 
{
PACKETHEADER Header;
UINT nUserID;
BYTE eStatus;
}STRUCT_IMSERVER_CHANGE_STATUS;

//更改用户状态应答
#define IMSERVER_BUDDY_STATUS IMSERVER_CMD_BASE+ 0x001E
typedef struct 
{
PACKETHEADER Header;
UINT nBuddyID;
BYTE eStatus;
}STRUCT_IMSERVER_BUDDY_STATUS;

From APPServer//
//提示客户端更新版本
//#define APPSERVER_NEWVERSIONAPPSERVER_CMD_BASE + 0x0001
//拒绝登录
//#define APPSERVER_REFUSE APPSERVER_CMD_BASE +0x0002
typedef enum
{
RESULT_REFUSE_VERSION= APPSERVER_ERROR_BASE +0x0001,
RESULT_REFUSE_MAXCONN,
};

//Appserver返回给IMClient的验证结果
#define APPSERVER_AUTHRESULT APPSERVER_CMD_BASE+ 0x0001

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;

//注意,nResult != RESULT_AUTHRESULT_OK时  包到此结束
DWORD dwSessionID;
IMPERSON_BASE_INFOPersonInfo;
BYTE nIMServer;//分配的IMServer

//nIMServer > 0 ,此处将填充nIMServer个IMSERVER_BASE_INFO;
IMSERVER_BASE_INFOIMServer[1];
} STRUCT_APPSERVER_AUTHRESULT;
typedef struct
{
PACKETHEADER Head;
CHAR strFilesrvIP[MAX_IPADDRESS + 1];
SHORT nFilesrvPort;
DWORD dwNewVersion;
} STRUCT_APPSERVER_NEWVERSION;

//Appserver到DBServer认证用户
#define APPSERVER_AUTHUSER APPSERVER_CMD_BASE +0x0002
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
CHAR strUserName[MAX_USERNAME + 1];
CHAR strPassword[MAX_PASSWORD + 1];
time_t tLastUpdate;
} STRUCT_APPSERVER_AUTHUSER;

//Appserver返回IMClient的好友列表
#define APPSERVER_BUDDYINFO APPSERVER_CMD_BASE +0x0003

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
BYTE bMustUpdate;//是否需要更新本地好友列表  0:不需要更新;1:必须更新
WORD wGroupCount;//分组个数
WORD wBuddyCount;//好友个数
// IMGROUP_BASE_INFOGroupInfo[1];

//如果wBuddyCount > 0并且bMustUpdate =1 ,此处将填充wBuddyCount个IMBUDDY_BASE_INFO结构
// IMBUDDY_BASE_INFOBuddyInfo[1];
} STRUCT_APPSERVER_BUDDYINFO;

//Appserver返回给IMServer的用户认证结果
#define APPSERVER_AUTHUSERRESPAPPSERVER_CMD_BASE + 0x0004
typedef struct
{
PACKETHEADER Header;
DWORD dwSessionID;
UINT nUserID;
} STRUCT_APPSERVER_AUTHUSERRESP;
enum
{
RESULT_USERAUTH_OK= RESULT_NOERROR,
RESULT_USERAUTH_PASSWORD= APPSERVER_ERROR_BASE+0x0003,
RESULT_USERAUTH_NOEXIT,
};

//APPServer->DBServer,用户上线
#define APPSERVER_USERONLINE APPSERVER_CMD_BASE+ 0x0005
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
CHAR m_strLocalIP[MAX_IPADDRESS + 1];
SHORT m_nLocalPort;
CHAR m_strNatIP[MAX_IPADDRESS + 1];
SHORT m_nNatPort;
} STRUCT_APPSERVER_USERONLINE;

//Appserver->IMServer,在线好友列表
#define APPSERVER_ONLINEBUDDY APPSERVER_CMD_BASE+ 0x0006

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
WORD wBuddyCount;//在线好友个数

//此处有wBuddyCount个IMBUDDY_ONLINE_INFO结构
IMBUDDY_ONLINE_INFO OnlineBuddy[1];
} STRUCT_APPSERVER_ONLINEBUDDY;

//APPServer->IMserver,通知好友上线
#define APPSERVER_NOTIFYONLINE APPSERVER_CMD_BASE+ 0x0007

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
IMBUDDY_ONLINE_INFO OnLineBuddy;
SHORT nUserIDCount;//用户ID个数
UINT nUserID[1];
} STRUCT_APPSERVER_NOTIFYONLINE;

//APPServer->DbServer,通知好友下线
#define APPSERVER_USEROFFLINE APPSERVER_CMD_BASE+ 0x0008

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
} STRUCT_APPSERVER_USEROFFLINE;

//APPServer->IMserver,通知好友下线
#define APPSERVER_NOTIFYOFFLINEAPPSERVER_CMD_BASE + 0x0009
typedef struct
{
PACKETHEADER Header;
UINT nOfflineUserID; //下线用户ID
SHORT nUserIDCount;//用户ID个数
UINT nUserID[1];
} STRUCT_APPSERVER_NOTIFYOFFLINE;

//Appserver转发加好友
#define APPSERVER_ADDBUDDY APPSERVER_CMD_BASE +0x000A
typedef struct
{
PACKETHEADER Header;
UINT nSourceID;
UINT nUserID;
CHAR strAddUserName[MAX_USERNAME + 1];
} STRUCT_APPSERVER_ADDBUDDY;

//Appserver ->IMServer
#define APPSERVER_ADDBUDDYRESPAPPSERVER_CMD_BASE + 0x000B

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
CHAR strAddUserName[MAX_USERNAME + 1];

//如果操作成功,此出接
IMBUDDY_ADD_INFOAddBuddyInfo;
} STRUCT_APPSERVER_ADDBUDDYRESP;

//Appserver->DbServer,删除好友
#define APPSERVER_DELBUDDY APPSERVER_CMD_BASE +0x000C
typedef struct
{
PACKETHEADER Header;
UINT nSourceID;
UINT nUserID;
UINT nDelUserID;
} STRUCT_APPSERVER_DELBUDDY;

//Appserver->IMServer,删除好友
#define APPSERVER_DELBUDDYRESPAPPSERVER_CMD_BASE + 0x000D
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
UINT nDelUserID;
} STRUCT_APPSERVER_DELBUDDYRESP;

//修改用户信息
#define APPSERVER_EDITINFO APPSERVER_CMD_BASE +0x000E
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
CHAR strPassword[MAX_PASSWORD + 1];
IMPERSON_BASE_INFOUserInfo;
} STRUCT_APPSERVER_EDITINFO;

//修改用户信息应答
#define APPSERVER_EDITINFORESPAPPSERVER_CMD_BASE + 0x000F
typedef struct
{
PACKETHEADER Header;
CHAR strPassword[MAX_PASSWORD + 1];
IMPERSON_BASE_INFOUserInfo;
} STRUCT_APPSERVER_EDITINFORESP;

//查询好友信息 appsvr->dbg
#define APPSERVER_QUERYINFO APPSERVER_CMD_BASE +0x0010
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
UINT nQueryUserID;
} STRUCT_APPSERVER_QUERYINFO;

//查询好友信息结果 appsvr->imsvr
#define APPSERVER_QUERYINFORESPAPPSERVER_CMD_BASE + 0x0011
//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nUserID;
UINT nQueryUserID;
//如果操作成功
IMPERSON_BASE_INFO UserInfo;//好友的个人详细信息
} STRUCT_APPSERVER_QUERYINFORESP;

//Imserver注册应答
#define APPSERVER_REGISTRYRESPAPPSERVER_CMD_BASE + 0x0100

//增加组 APPSERVER->DBServer
#define APPSERVER_ADDGROUP APPSERVER_CMD_BASE +0x0200
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
CHAR strGroupName[MAX_GROUPNAME + 1];
} STRUCT_APPSERVER_ADDGROUP;

//增加组应答 APPSERVER->IMSERVER
#define APPSERVER_ADDGROUPRESPAPPSERVER_CMD_BASE + 0x0201
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
CHAR strGroupName[MAX_GROUPNAME + 1];
UINT nGroupID;//增加失败时无效
} STRUCT_APPSERVER_ADDGROUPRESP;

//删除组 APPSERVER->DBServer
#define APPSERVER_DELGROUP APPSERVER_CMD_BASE +0x0202
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
UINT nGroupID;
} STRUCT_APPSERVER_DELGROUP;

//删除组应答 APPSERVER->IMSERVER
#define APPSERVER_DELGROUPRESPAPPSERVER_CMD_BASE + 0x0203
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
} STRUCT_APPSERVER_DELGROUPRESP;

//修改好友所属的组 appsvr->dbserver
#define APPSERVER_EDITUSERGROUP  APPSERVER_CMD_BASE + 0x0204
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
UINT nBuddyID;
UINT nGroupID;
} STRUCT_APPSERVER_EDITUSERGROUP;

//修改好友所属的组应答 appsvr->imsvr
#define APPSERVER_EDITUSERGROUPRESP  APPSERVER_CMD_BASE + 0x0205
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nBuddyID;
UINT nGroupID;
} STRUCT_APPSERVER_EDITUSERGROUPRESP;

//重命名组 appsvr->dbserver
#define APPSERVER_RENAMEGROUP  APPSERVER_CMD_BASE + 0x0206
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
UINT nGroupID;
CHAR strNewGroupName[MAX_GROUPNAME + 1];
} STRUCT_APPSERVER_RENAMEGROUP;

//重命名组应答 appsvr->imsvr
#define APPSERVER_RENAMEGROUPRESP  APPSERVER_CMD_BASE + 0x0207
typedef struct
{
PACKETHEADER Head;
UINT nUserID;
UINT nGroupID;
CHAR strNewGroupName[MAX_GROUPNAME + 1];
} STRUCT_APPSERVER_RENAMEGROUPRESP;

#define APPSERVER_KICKOUTUSERAPPSERVER_CMD_BASE+0x0208

//更改用户状态
#define APPSERVER_CHANGE_STATUSAPPSERVER_CMD_BASE + 0x0209
typedef struct 
{
PACKETHEADER Header;
UINT nSourceID;
UINT nUserID;
BYTE eStatus;
}STRUCT_APPSERVER_CHANGE_STATUS;

//好友状态改变
#define APPSERVER_BUDDY_STATUSAPPSERVER_CMD_BASE + 0x020A
typedef struct 
{
PACKETHEADER Header;
UINT nUserID;
BYTE eStatus;
UINT nBuddyCount;   //好友个数 
UINT nBuddys[1];    //好友列表
}STRUCT_APPSERVER_BUDDY_STATUS;

enum{

RESULT_KICKOUT_OTHERPLACE=APPSERVER_ERROR_BASE+0x0010 ,   //在其他地方上线
RESULT_KICKOUT_SERVICE,//服务器维护
};

typedef struct  {
PACKETHEADER Header;
UINT nUserID;
}STRUCT_APPSERVER_KICKOUTUSER;

#define APPSERVER_USERONLINERESPAPPSERVER_CMD_BASE+0x0103
typedef struct  {
PACKETHEADER Header;
DWORD dwSessionID;
UINT nUserID;
}STRUCT_APPSERVER_USERONLINERESP;

//转发IM服务器心跳包 appsvr->dbserver
typedef struct  {
PACKETHEADER Header;
DWORD nSourceID;
UINT nIMSvrID;
}STRUCT_APPSERVER_IMSVRHEARTBEAT;

//应用服务器下线 appsvr->dbserver
#define APPSERVER_OFFLINEAPPSERVER_CMD_BASE+0x0101
typedef struct  {
PACKETHEADER Header;
DWORD nSourceID;
int nSvrID;
}STRUCT_APPSERVER_OFFLINE;

//应用服务器心跳包 appsvr->dbserver
#define APPSERVER_HEARTBEATAPPSERVER_CMD_BASE+0x0102
typedef struct  {
PACKETHEADER Header;
DWORD nSourceID;
int nSvrID;
}STRUCT_APPSERVER_HEARTBEAT;

From DataBaseServer//
//DBSSERVER认证结果
#define DBSERVER_AUTHRESULT DBSERVER_CMD_BASE +0x0001

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nSourceID;

//注意,nResult != RESULT_AUTHRESULT_OK时  包到此结束
IMPERSON_BASE_INFOPersonInfo;
BYTE bMustUpdate;//是否需要更新本地好友列表  0:不需要更新;1:必须更新
BYTE bMustFeedback;//是否有加好友验证消息需反馈0:没有;1:有
WORD wAddMeBuddy;//加过本方的人的个数
WORD wBuddyCount;//好友个数 2WORD

//如果wAddMeBuddy > 0并且bMustFeeBase =1 ,此处将填充wAddMeBuddy个UserID;
//如果wBuddyCount > 0并且bMustUpdate =1 ,此处将填充wBuddyCount个IMBUDDY_BASE_INFO结构
} STRUCT_DBSERVER_AUTHRESULT;
typedef enum
{
RESULT_AUTHRESULT_OK= RESULT_NOERROR,
RESULT_AUTHRESULT_PASSWORD= DBSERVER_ERROR_BASE+ 0x0001,
RESULT_AUTHRESULT_NOEXIST,
};

//DBServer对加好友的应答 ->Appserver
#define DBSERVER_ADDBUDDYRESP DBSERVER_CMD_BASE+ 0x0002

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nSourceID;
UINT nUserID;
CHAR strAddUserName[MAX_USERNAME + 1];

//如果操作成功,此出接
IMBUDDY_ADD_INFOAddBuddyInfo;
} STRUCT_DBSERVER_ADDBUDDYRESP;

//DBServer对加好友的应答 ->Appserver
#define DBSERVER_DELBUDDYRESP DBSERVER_CMD_BASE+ 0x0003

//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nSourceID;
UINT nUserID;
UINT nDelUserID;
} STRUCT_DBSERVER_DELBUDDYRESP;

//修改信息结果
#define DBSERVER_EDITINFORESP DBSERVER_CMD_BASE+ 0x0004
typedef struct
{
PACKETHEADER Header;
UINT nSourceID;
CHAR strPassword[MAX_PASSWORD + 1];
IMPERSON_BASE_INFOUserInfo;
} STRUCT_DBSERVER_EDITINFORESP;

//查询好友信息结果 dbg->appsvr
#define DBSERVER_QUERYINFORESP DBSERVER_CMD_BASE+ 0x0005
//此包为不定长包,注意判断
typedef struct
{
PACKETHEADER Header;
UINT nSourceID;
UINT nUserID;
UINT nQueryUserID;
//如果操作成功
IMPERSON_BASE_INFO UserInfo;//好友的个人详细信息
/*
CHAR strUserName[MAX_USERNAME + 1];
CHAR strNickName[MAX_NICKNAME + 1];// 昵称
BYTE bPicture;// 图标ID
*/

} STRUCT_DBSERVER_QUERYINFORESP;
#define DBSERVER_AUTHIMSERVER DBSERVER_CMD_BASE+ 0x0006
enum
{
AUTH_IMSERVER_OK= RESULT_NOERROR,
AUTH_IMSERVER_NOEXIST= DBSERVER_ERROR_BASE+0x0010,
AUTH_IMSERVER_PASSWORD
};

/*  状态码: 0x0000  验证成功
       0x7010   没有注册的IMServer
       0x7011 注册密码错误
*/

//DBSERVER-APPSERVER
#define DBSERVER_ADDGROUPRESP DBSERVER_CMD_BASE+ 0x0010
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
CHAR strGroupName[MAX_GROUPNAME + 1];
UINT nGroupID;//增加失败时无效
} STRUCT_DBSERVER_ADDGROUPRESP;
enum
{
ADDGROUP_SUCCESSED= RESULT_NOERROR,
APPGROUP_EXIST= DBSERVER_ERROR_BASE +0x0020,
APPGROUP_INVALID_NAME= DBSERVER_ERROR_BASE+0x0021
};

//DBSERVER-APPSERVER
#define DBSERVER_DELGROUPRESP DBSERVER_CMD_BASE+ 0x0011
typedef struct
{
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
UINT nGroupID;
} STRUCT_DBSERVER_DELGROUPRESP;
enum
{
DELGROUP_SUCCESSED= RESULT_NOERROR,
DELGROUP_NOEXIST= DBSERVER_ERROR_BASE +0x0022,
};

#define DBSERVER_EDITUSERGROUPRESP DBSERVER_CMD_BASE + 0x0012
typedef struct  {
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
UINT nBuddyID;
UINT nGroupID;
}STRUCT_DBSERVER_EDITUSERGROUPRESP;

#define DBSERVER_RENAMEGROUPRESP DBSERVER_CMD_BASE + 0x0013
typedef struct  {
PACKETHEADER Head;
UINT nSourceID;
UINT nUserID;
UINT nGroupID;
CHAR strNewGroupName[MAX_GROUPNAME + 1];
}STRUCT_DBSERVER_RENAMEGROUPRESP;

更改用户状态应答
//#define DBSERVER_CHANGE_STATUSRESPDBSERVER_CMD_BASE + 0x0014
//typedef struct 
//{
// PACKETHEADERHeader;
// UINT nSourceID;
// UINT nUserID;
// BYTE eStatus;
//}STRUCT_DBSERVER_CHANGE_STATUSRESP;

#pragma pack()
#endif

下载地址:

即时通讯软件(开源例子)

点击下载


即时通讯软件源码[仅供学习参考,不能用于商业用途]
点击下载

本人的技术博客和个人网站

1 :点击进入  2:点击进入

下载不了的朋友可以加我QQ1152597562我在线发给你

潜心研究即时通讯软件,基于企业im源码 分享相关推荐

  1. 原生仿微信社交社区即时通讯聊天双端APP源码开源带PC客户端文档说明

    简介: 原生仿微信社交社区即时通讯聊天双端APP源码开源带PC客户端文档说明 5438亲测完美搭建 网盘下载地址: http://kekewangLuo.net/uiBBnJ8xQup0 图片:

  2. 分享一套开源的即时通讯 IM 聊天系统(附源码)

    大家好,今天推荐一个即时通讯系统项目. 上次是谁要的即时通讯系统项目啊,帮你找到了.这是我目前见过的最好的即时通讯系统项目.功能完整,代码结构清晰.值得推荐.开篇电商平台最不能缺的就是即时通讯,例如通 ...

  3. android社交源码,原生仿微信社交社区即时通讯聊天双端APP源码开源 带PC客户端...

    野火IM是一套跨平台.核心功能开源的即时通讯解决方案,主要包含以下内容. | 仓库                                                         | ...

  4. java SSM 框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生 ...

  5. 从零开始开发IM(即时通讯)服务端附源码

    前言 首先讲讲IM(即时通讯)技术可以用来做什么: 聊天:qq.微信 直播:斗鱼直播.抖音 实时位置共享.游戏多人互动等等 可以说几乎所有高实时性的应用场景都需要用到IM技术. 本篇将带大家从零开始搭 ...

  6. 代码生成器 websocket即时通讯 shiro redis 后台框架源码

    获取[下载地址]   QQ: 313596790 A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 ...

  7. ThinkPHP聊天室即时通讯系统 H5聊天系统APP源码 类似微信的聊天APP

    介绍: 前端: 用Dcloud 的 uni-app全系,基于vue.js和微信小程序开发模式. 目前支持APP(android.ios).H5.微信小程序.支付宝小程序5端. 在特定场景可以用weex ...

  8. 如何选择企业即时通讯软件

    如何选择适合的企业即时通讯软件     目前来说,越来越多的大中型企业意识到上班时间使用个人通讯工具(IM)存在的危害(如:交流对象及交流内容的不可控.必须开通外网存在安全隐患等),并且已经开始寻求一 ...

  9. 企业即时通讯软件FreeEIM飞鸽传书

    企业即时通讯软件FreeEIM飞鸽传书,是一款基于TCP/IP协议.基于局域网广播消息模式的通讯软件,适合企业或政府部门局域网内部使用. 飞鸽传书用户可在企业内部或外部通过该软件进行工作上的交流,软件 ...

最新文章

  1. Linux 基础 - 磁盘管理 -06
  2. 数学--数论--同余及其性质(超详细)
  3. 最难啃的《深度学习》圣经花书,居然新出版了视频课!
  4. JS:关于JS字面量及其容易忽略的12个小问题
  5. 如何检测浏览器所支持的最小字体大小
  6. 设计基于计算机的机械手控制系统,基于PLC的工业机械手控制系统设计
  7. mysql excel导入顺序错误_Excel导入MySQL数据出现字段错行原因解决方案
  8. ElasticSearch内存优化
  9. 服务器自检后显示scsi,“服务器百问百答”服务器怎样格式化SCSI硬盘?
  10. 用html语言设计李白的一首诗,李白《赠汪伦》的教案设计
  11. 联想服务器怎么加硬盘分区,联想EDU硬盘保护OEM分区的创建以及安装方法
  12. 每一个梦想都要让它长上翅膀
  13. keil v5 No Ulink2/Me Device Found 的解决方法
  14. js鸡兔同笼35个头94只脚用 鸡有多少只兔有多少只?
  15. ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步6屏带中文显示版本迭代持续更新
  16. 应用在触摸电视机中的触摸芯片
  17. selenium+python自动抢购源码
  18. Android应用开发转车载工程师——串口通信学习
  19. 小白的proxmox ve(pve)打造AIO(all in boom)折腾日记 (五)openwrt虚拟机建立(包括openwrt系统编译)
  20. 坚果云(创建 删除 下载 上传)代码,基于autojs开发的脚本

热门文章

  1. Shader --- 法阵
  2. 司铭宇老师谈大客户销售技巧之如何做好大客户营销
  3. [ WARN] [1588040435.867625184]: MessageFilter [target=odom ]: Dropped 97.37% of messages so
  4. P2.5室内LED显示屏的技术参数以及优点分析
  5. html绝对定位重叠,怎么消除css中的绝对定位重叠问题
  6. Latex排版—(2)基本结构
  7. 都在说测试左移和右移,只有这篇文章说明白了
  8. python解析markdown_fluent-python-translate
  9. python批量打印网页_web 批量打印
  10. pythonpdf教程_python基础教程pdf