LOGIN_REPLY (5A 00) 登陆响应
-----------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
4 bytes xx xx xx xx USER_UIN 用户的UIN
4 bytes xx xx xx xx USER_IP 用户的IP地址
2 bytes xx xx LOGIN_SEQ_NUM 登陆序列号
4 bytes 01 00 01 00 X1 *Unknown
4 bytes xx 00 16 00 X2 *Unknown (xx=19 or 18)
4 bytes 8C 00 00 00 X3 *Unknown
4 bytes 78 00 05 00 X4 *Unknown
6 bytes 0A 00 05 00 01 00 X5 *Unknown
在登陆请求后被发回,注意LOGIN_SEQ_NUM 跟LOGIN请求中的SEQ_NUM相同.
USER_ONLINE (6E 00) CONTACT LIST中的用户已经上线,或者改变了状态
-----------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
4 bytes xx xx xx xx REMOTE_UIN 登陆用户的UIN
4 bytes xx xx xx xx REMOTE_IP 用户的IP地址
4 bytes xx xx xx xx REMOTE_PORT 用户的端口
4 bytes xx xx xx xx REMOTE_REAL_IP 用户的实际IP地址
1 byte 04 X1 *Unknown
4 bytes xx xx xx xx STATUS 用户的新状态
4 bytes 02 00 00 00 X2 *Unkown
REMOTE_IP 是远程用户的外部(outer)IP地址,REMOTE_REAL_IP 是远程用户的内部(inner)
IP地址,第二个是在远程用户处于防火墙后时才有用的。REMOTE_PORT是可以创建直接连接的
远程用户的端口号。
USER_OFFLINE (78 00) CONTACT LIST中的用户离线了
------------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
4 bytes xx xx xx xx REMOTE_UIN 离线用户的UIN
USER_FOUND (8C 00) 搜索结果记录集
----------
参数:
长度 内容 字段名 描述
------ ------------------ ---- --- --------
2 bytes xx xx SEARCH_SEQ_NUM 搜索序列号
4 bytes xx xx xx xx FOUND_UIN 搜索用户的UIN
2 bytes xx xx LENGTH NICK_NAME 的长度,包括 NULL
variable NICK_NAME 以NULL结束的 nick name
2 bytes xx xx LENGTH FIRST_NAME 的长度,包括 NULL
variable FIRST_NAME 以NULL结束的 first name
2 bytes xx xx LENGTH LAST_NAME 的长度,包括 NULL
variable LAST_NAME 以NULL结束的 last name
2 bytes xx xx LENGTH E_MAIL 的长度,包括 NULL
variable E_MAIL 以NULL结束的 e-mail
1 byte xx AUTHORIZE 用户的认证状态
搜索结果中的每一条记录,都将返回一条USER_FOUND响应,当所有的USER_FOUND命令都
发送完毕,一条END_OF_SEARCH将被发送。如果没有搜索结果,命令END_OF_SEARCH将
直接被发送。 AUTHORIZE 决定了用户是否允许其他人把他加入CONTACT LIST中,通常有
两个值:
00 = 需要认证
01 = 不需要认证
RECEIVE_MESSAGE (DC 00) 离线消息发送完成
---------------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
4 bytes xx xx xx xx REMOTE_UIN 接受者的UIN
2 bytes xx xx YEAR 发送的年
1 byte xx MONTH 发送的月
1 byte xx DAY 发送的日期
1 byte xx HOUR 小时,GMT格式
1 byte xx MINUTE 分钟
2 bytes xx xx TYPE 消息类型,比如URL
2 bytes xx xx LENGTH 消息长度,包括NULL
variable MESSAGE 已发送的消息,以NULL结束
注意HOUR是本地时间减1(除非GMT无关?)消息类型可以是:
01 00 = 正常消息
04 00 = URL
0C 00 = 'You were added' 消息. (MESSAGE 包括: FE name> FE FE FE 。authorize
是 '1' (31)如果用户允许任意添加,否则为 '0' (30)。)
INFO_REPLY (18 01) 返回用户基本信息
----------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
2 bytes xx xx INFO_SEQ_NUM 信息序列号
4 bytes xx xx xx xx REMOTE_UIN 远程用户的UIN
2 bytes xx xx LENGTH NICK_NAME的长度, includingNULL
variable NICK_NAME 远程用户的 nick name
2 bytes xx xx LENGTH FIRST_NAME的长度, includingNULL
variable FIRST_NAME 远程用户的 first name
2 bytes xx xx LENGTH LAST_NAME的长度 includingNULL
variable LAST_NAME 远程用户的 last name
2 bytes xx xx LENGTH E_MAIL的长度 including NULL
variable E_MAIL 远程用户的 e-mail
1 byte xx AUTHORIZE 远程用户的认证状态
参数跟 USER_FOUND (8C 00)一样的。
EXT_INFO_REPLY (22 01) 返回用户扩展信息
--------------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
2 bytes xx xx INFO_SEQ_NUM 信息序列号
4 bytes xx xx xx xx REMOTE_UIN 远程用户的 UIN
2 bytes xx xx LENGTH Lenght of CITY including NULL
variable CITY 远程用户的 city
2 bytes xx xx COUNTRY_CODE The remote user's country code
1 byte xx COUNTRY_STATUS Indicates if COUNTRY_CODE is entered or not
2 bytes xx xx LENGTH Lenght of STATE including NULL
variable STATE 远程用户的 state (USA only)
2 bytes xx xx AGE 远程用户的 age
1 byte xx SEX 远程用户的 sex
2 bytes xx xx LENGTH Lenght of PHONE including NULL
variable PHONE 远程用户的 city
2 bytes xx xx LENGTH Lenght of HOME_PAGE includingNULL
variable HOME_PAGE 远程用户的s city
2 bytes xx xx LENGTH Lenght of ABOUT including NULL
variable ABOUT 远程用户的 city
COUNTRY_CODE 所使用的代码是国际电话号码的前缀,比如01 00 (1) 代表 USA,
2C 00 (44) 代表 UK, 2E 00 (46) 代表 Sweden, 等等。.
COUNTRY_STATUS 通常为 FE, 除非远程用户没有输入国家信息,这时为 FF FF, 同时
COUNTRY_STATUS 将为 9C。如果用户没有输入年龄,则 AGE 将为 FF FF, SEX 有三种可能的
值:
00 = 没提供
01 = 女
02 = 男
ABOUT 是一个可选的字段。
STATUS_UPDATE (A4 01) CONTACT LIST里的用户改变了状态
-------------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
4 bytes xx xx xx xx REMOTE_UIN 改变了状态的用户的UIN
4 bytes xx xx xx xx STATUS 新状态
参数跟 STATUS_CHANGE (D8 04)一样。
客户端间的TCP通信,点对点通信
===============================================================
当一个用户希望发送一条消息,比如URL给另一个用户,(称为远程用户,同本地用户相
对应),本地用户首先检查是否已经有TCP连接连到那个用户。如果有,则直接使用这个
连接,如果没有,则先获取该用户的信息,包括IP地址,端口等,这些信息在远程用户
登陆时,服务器将发送给本地用户。然后建立一个连接,通常,端口号在1200到1300间,
(十进制)。当新连接建立起来后,一条CHANNEL_INIT命令将发送。之后,每发送一条
消息,将发送一条CHANNEL_MESSAGE命令。所有消息必须被对方确认,使用CHANNEL_ACK,
另外,所有消息将被接收者发回一条消息作为回应--通常为一条空消息,除非用户粘贴
了Away/DND消息,这个时候他们被作为回应发送。
TCP通信跟UDP通信类似,所有的通信都是通过分离的包来完成。每个包都必须包含包的
长度信息,作为前两个字节。所有的消息将UIN作为接下来的一个字段。
CHANNEL_INIT 初始化一个通信
------------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
2 bytes 1A 00 LENGTH 包的长度
1 byte FF INIT_IDENT 标识这个包是一个初始包
4 bytes 02 00 00 00 X1 *Unknown
4 bytes 00 00 00 00 X2 *Unknown
4 bytes xx xx xx xx MY_UIN 本地用户的UIN
4 bytes xx xx xx xx MY_IP 本地用户的IP
4 bytes xx xx xx xx MY_IP_REAL 本地用户的实际IP
1 byte 04 X3 *Unknown
4 bytes xx xx xx xx MY_PORT 本地用户用来接收消息的端口
注意用来发送的端口跟接受端口不同。
CHANNEL_MESSAGE 发送消息给在线用户
------------
参数:
长度 内容 字段名 描述
------ ------------------ ---- -----------
2 bytes xx xx LENGTH 包的长度
4 bytes xx xx xx xx UIN 本地用户的UIN
2 bytes 02 00 VERSION 标识包为一个ICQ包
2 bytes EE 07 MSG_COMMAND 消息的类型
2 bytes 00 00 X1 *Unknown
4 bytes xx xx xx xx UIN_2 本地用户的UIN
2 bytes xx xx TYPE 消息的类型
2 bytes xx xx LENGTH 消息长度,包括NULL
variable MESSAGE 消息,以NULL结束
4 bytes xx xx xx xx MY_IP_REAL 本地用户实际IP地址
4 bytes xx xx xx xx MY_IP 本地用户IP地址
4 bytes xx xx xx xx PORT 本地用户用来接收消息的IP地址
1 byte 04 X2 *Unknown
2 bytes 00 00 X3 *Unknown
2 bytes xx xx CMD_TYPE 标识消息是原始消息还是回复
4 bytes xx xx xx xx X4 *Unknown (校验和?序列号?)
TYPE字段跟 RECEIVE_MESSAGE 里的一样. CMD_TYPE 有两种可能取值:
10 00 = 这是一条原始的,新消息
00 00 = 这是一条回复消息
自动回复作为新消息的确认被发送,通常为一条空消息,如果远程用户处于Away或者DND
模式,则其回复消息被发送。X4字段有点狡猾,经常在 00 FF FF FF 和 FF FF FF FF 之间,
但是确切的功能还不知道。
补充:
Command 0x0104 - 通过服务器接收在线消息
0x0002 - ICQ Version
0x0104 - 命令
0x???? - 序列号
0x???????? - 发送者的 UIN.
0x?? - Type (跟 0x00DC 里的一样)
0x?? - 消息的长度,包括NULL.
消息,0x00 结束。
Command 0x00e6 - 服务器上没有更多的离线消息了(服务器发送的).
Command 0x0442 - 删除所有离线消息 (客户端发送).
Command 64 00,口令错误
在发送了LOGIN后,服务器返回的命令。
Command: 0x0028 (28 00 in intel order)
Version: 2
Data: 4b 20 ab 00 (Wich happens to be my UIN...)
服务器发出的,客户端已经离线了