潜心研究即时通讯软件,基于企业im源码 分享
多年前一个机会参与设计开发一个企业级的即时通讯软件项目,当时类似企业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) 0x1020:Client->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源码 分享相关推荐
- 原生仿微信社交社区即时通讯聊天双端APP源码开源带PC客户端文档说明
简介: 原生仿微信社交社区即时通讯聊天双端APP源码开源带PC客户端文档说明 5438亲测完美搭建 网盘下载地址: http://kekewangLuo.net/uiBBnJ8xQup0 图片:
- 分享一套开源的即时通讯 IM 聊天系统(附源码)
大家好,今天推荐一个即时通讯系统项目. 上次是谁要的即时通讯系统项目啊,帮你找到了.这是我目前见过的最好的即时通讯系统项目.功能完整,代码结构清晰.值得推荐.开篇电商平台最不能缺的就是即时通讯,例如通 ...
- android社交源码,原生仿微信社交社区即时通讯聊天双端APP源码开源 带PC客户端...
野火IM是一套跨平台.核心功能开源的即时通讯解决方案,主要包含以下内容. | 仓库 | ...
- java SSM 框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码
A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生 ...
- 从零开始开发IM(即时通讯)服务端附源码
前言 首先讲讲IM(即时通讯)技术可以用来做什么: 聊天:qq.微信 直播:斗鱼直播.抖音 实时位置共享.游戏多人互动等等 可以说几乎所有高实时性的应用场景都需要用到IM技术. 本篇将带大家从零开始搭 ...
- 代码生成器 websocket即时通讯 shiro redis 后台框架源码
获取[下载地址] QQ: 313596790 A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 ...
- ThinkPHP聊天室即时通讯系统 H5聊天系统APP源码 类似微信的聊天APP
介绍: 前端: 用Dcloud 的 uni-app全系,基于vue.js和微信小程序开发模式. 目前支持APP(android.ios).H5.微信小程序.支付宝小程序5端. 在特定场景可以用weex ...
- 如何选择企业即时通讯软件
如何选择适合的企业即时通讯软件 目前来说,越来越多的大中型企业意识到上班时间使用个人通讯工具(IM)存在的危害(如:交流对象及交流内容的不可控.必须开通外网存在安全隐患等),并且已经开始寻求一 ...
- 企业即时通讯软件FreeEIM飞鸽传书
企业即时通讯软件FreeEIM飞鸽传书,是一款基于TCP/IP协议.基于局域网广播消息模式的通讯软件,适合企业或政府部门局域网内部使用. 飞鸽传书用户可在企业内部或外部通过该软件进行工作上的交流,软件 ...
最新文章
- Linux 基础 - 磁盘管理 -06
- 数学--数论--同余及其性质(超详细)
- 最难啃的《深度学习》圣经花书,居然新出版了视频课!
- JS:关于JS字面量及其容易忽略的12个小问题
- 如何检测浏览器所支持的最小字体大小
- 设计基于计算机的机械手控制系统,基于PLC的工业机械手控制系统设计
- mysql excel导入顺序错误_Excel导入MySQL数据出现字段错行原因解决方案
- ElasticSearch内存优化
- 服务器自检后显示scsi,“服务器百问百答”服务器怎样格式化SCSI硬盘?
- 用html语言设计李白的一首诗,李白《赠汪伦》的教案设计
- 联想服务器怎么加硬盘分区,联想EDU硬盘保护OEM分区的创建以及安装方法
- 每一个梦想都要让它长上翅膀
- keil v5 No Ulink2/Me Device Found 的解决方法
- js鸡兔同笼35个头94只脚用 鸡有多少只兔有多少只?
- ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步6屏带中文显示版本迭代持续更新
- 应用在触摸电视机中的触摸芯片
- selenium+python自动抢购源码
- Android应用开发转车载工程师——串口通信学习
- 小白的proxmox ve(pve)打造AIO(all in boom)折腾日记 (五)openwrt虚拟机建立(包括openwrt系统编译)
- 坚果云(创建 删除 下载 上传)代码,基于autojs开发的脚本
热门文章
- Shader --- 法阵
- 司铭宇老师谈大客户销售技巧之如何做好大客户营销
- [ WARN] [1588040435.867625184]: MessageFilter [target=odom ]: Dropped 97.37% of messages so
- P2.5室内LED显示屏的技术参数以及优点分析
- html绝对定位重叠,怎么消除css中的绝对定位重叠问题
- Latex排版—(2)基本结构
- 都在说测试左移和右移,只有这篇文章说明白了
- python解析markdown_fluent-python-translate
- python批量打印网页_web 批量打印
- pythonpdf教程_python基础教程pdf