| 1 |
######################## |
|---|
| 2 |
## THE ICQ PROTOCOL ## |
|---|
| 3 |
######################## |
|---|
| 4 |
|
|---|
| 5 |
Version 0.91 |
|---|
| 6 |
Last update 12 April 1998 |
|---|
| 7 |
(Minor update 11 May 1998 and 26 August 1998) |
|---|
| 8 |
Created by Magnus Ihse (d95-mih@nada.kth.se) |
|---|
| 9 |
Copyright © 1998 |
|---|
| 10 |
|
|---|
| 11 |
The home page of this specification is |
|---|
| 12 |
http://www.student.nada.kth.se/~d95-mih/icq/ |
|---|
| 13 |
|
|---|
| 14 |
To participate in the mailing list icq-devel, send a mail to |
|---|
| 15 |
majordomo@lists.realminfo.com, with the message body consisting only of the |
|---|
| 16 |
line "subscribe icq-devel". |
|---|
| 17 |
|
|---|
| 18 |
About this document |
|---|
| 19 |
------------------- |
|---|
| 20 |
Please note: I am in no way affiliated with Mirabilis. This is an unofficial |
|---|
| 21 |
specification, based solely on TCP/UDP packet traces and my own guesswork. |
|---|
| 22 |
This means that the information in here might be (and probably _will_ be |
|---|
| 23 |
:-)) incorrect. It also means that even _if_ some parts of this specification |
|---|
| 24 |
_is_ correct, they may change at any moment due to the Divine Will of |
|---|
| 25 |
Mirabilis. |
|---|
| 26 |
|
|---|
| 27 |
I am a computer science student at the Royal Institute of Technology in |
|---|
| 28 |
Sweden, and this is a hobby project - something I have been doing in my |
|---|
| 29 |
free time (i.e., late in the nights :-)). This means that I don't have |
|---|
| 30 |
much time to spend on updating this document. |
|---|
| 31 |
|
|---|
| 32 |
Recently I have received a lot of requests for this document, and many |
|---|
| 33 |
persons have offered to help me complete and correct it. I am very thankful |
|---|
| 34 |
for such help, and all contributions will of cource receive proper credit. |
|---|
| 35 |
Otherwere in this document is described in more detail what you can do to |
|---|
| 36 |
help, and how you should do it. |
|---|
| 37 |
|
|---|
| 38 |
Legal information |
|---|
| 39 |
----------------- |
|---|
| 40 |
Aa far as I can tell (but I am not a laywer), the way I have extracted |
|---|
| 41 |
this information complies with Mirabilis License agreement, which states: |
|---|
| 42 |
"You agree not to reverse engineer, decompile or disassemble the software." |
|---|
| 43 |
I have not reverse engineered, decompiled or disassembled the software |
|---|
| 44 |
(i.e. Mirabilis ICQ client) to get this information. I have only been |
|---|
| 45 |
looking at the TCP and UDP packets send out from, and received by, my |
|---|
| 46 |
computer. |
|---|
| 47 |
|
|---|
| 48 |
If you are a Mirabilis employee, and you feel that this document still |
|---|
| 49 |
violates the License agreement, or if you on other grounds think that |
|---|
| 50 |
this document is dubious - please contact me as soon as possible! |
|---|
| 51 |
(My e-mail address given at top of this document.) |
|---|
| 52 |
|
|---|
| 53 |
|
|---|
| 54 |
Copyright |
|---|
| 55 |
--------- |
|---|
| 56 |
This document is protected under international copyright law. You may |
|---|
| 57 |
not modify this document. You may, however, make an unlimited number |
|---|
| 58 |
of copies of this document, as long as it is kept intact. You may |
|---|
| 59 |
freely distribute this document electronically (on the Internet or |
|---|
| 60 |
otherwise) or on paper. |
|---|
| 61 |
|
|---|
| 62 |
Any trademarks mentioned in this text belongs to their respective owner. |
|---|
| 63 |
|
|---|
| 64 |
Disclaimer |
|---|
| 65 |
---------- |
|---|
| 66 |
LICENSE AGREEMENT |
|---|
| 67 |
|
|---|
| 68 |
This document and the information present herein is provided by Magnus Ihse |
|---|
| 69 |
("the Author") for your personal use only. You agree to the full |
|---|
| 70 |
responsibility for the results of your use of this document or the information |
|---|
| 71 |
present herein. |
|---|
| 72 |
|
|---|
| 73 |
By using this document or the information present herein, you accept |
|---|
| 74 |
the terms of this license agreement. |
|---|
| 75 |
|
|---|
| 76 |
THIS INFORMATION IS PROVIDED ON AN "AS IS" BASIS. THE AUTHOR MAKES NO |
|---|
| 77 |
WARRANTIES, EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THOSE OF |
|---|
| 78 |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, WITH RESPECT TO THIS |
|---|
| 79 |
DOCUMENT AND THE INFORMATION PRESENT HEREIN. THE AUTHOR DOES NOT WARRANT, |
|---|
| 80 |
GUARANTEE OR MAKE ANY REPRESENTATIONS REGARDING THE USE OR THE RESULTS OF |
|---|
| 81 |
THE USE OF THIS DOCUMENT OR THE INFORMATION PRESENT HEREIN, IN TERMS OF THE |
|---|
| 82 |
ACCURACY, RELIABILITY, QUALITY, VALIDITY, STABILITY, COMPLETENESS, |
|---|
| 83 |
CURRENTNESS, OR OTHERWISE. THE ENTIRE RISK OF USING THE INFORMATION PRESENT |
|---|
| 84 |
IN THIS DOCUMENT IS ASSUMED BY THE USER. |
|---|
| 85 |
|
|---|
| 86 |
IN NO EVENT WILL THE AUTHOR BE LIABLE TO ANY PARTY (i) FOR ANY DIRECT, |
|---|
| 87 |
INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, |
|---|
| 88 |
BUT NOT LIMITED TO, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS |
|---|
| 89 |
INTERRUPTION, LOSS OF PROGRAMS OR INFORMATION, AND THE LIKE), OR ANY OTHER |
|---|
| 90 |
DAMAGES ARISING IN ANY WAY OUT OF THE AVAILABILITY, USE, RELIANCE ON, OR |
|---|
| 91 |
INABILITY TO USE THIS DOCUMENT OR THE INFORMATION PRESENT HEREIN, EVEN IF |
|---|
| 92 |
THE AUTHOR HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, AND |
|---|
| 93 |
REGARDLESS OF THE FORM OF ACTION, WHETHER IN CONTRACT, TORT, OR OTHERWISE; |
|---|
| 94 |
OR (ii) FOR ANY CLAIM ATTRIBUTABLE TO ERRORS, OMISSIONS, OR OTHER |
|---|
| 95 |
INACCURACIES IN, OR DESTRUCTIVE PROPERTIES OF ANY INFORMATION. |
|---|
| 96 |
|
|---|
| 97 |
Writing an ICQ clone |
|---|
| 98 |
-------------------- |
|---|
| 99 |
Since the public release of this document, at least two different ICQ clones |
|---|
| 100 |
have been created. They are at the time of writing very much under |
|---|
| 101 |
development, but are at least partly functioning. :-) More information can |
|---|
| 102 |
be found on my web page, or through the icq-devel mailing list. |
|---|
| 103 |
(For web page URL or subscription information, see top of this document.) |
|---|
| 104 |
|
|---|
| 105 |
What needs to be done |
|---|
| 106 |
--------------------- |
|---|
| 107 |
The worst deficiency of this document is the lack of information about |
|---|
| 108 |
version 3 and version 4 of the protocol. These versions are used by ICQ98 |
|---|
| 109 |
(older beta versions of ICQ98 seems to have used only version 3, the latest |
|---|
| 110 |
version as of today seems to use both version 3 and version 4). This document |
|---|
| 111 |
only describes version 2 of the protocol, which was used by versions up to |
|---|
| 112 |
but not including ICQ98 (I think v1.113 was the latest version of ICQ using |
|---|
| 113 |
version 2 of the protocol). Note that the ICQ version numbers refer to the |
|---|
| 114 |
Windows 95/NT version of ICQ. I think that the Mac and Java version still |
|---|
| 115 |
uses version 2, but I haven't checked this (please correct me if I'm wrong!). |
|---|
| 116 |
|
|---|
| 117 |
So, what's the difference between version 2 and 3/4? As far as I can tell, |
|---|
| 118 |
the major difference is that all packets in version 3/4 has some sort of |
|---|
| 119 |
unique code attached to it. I think it is part of an anti-spoof scheme, but |
|---|
| 120 |
I am not sure. I have not been able to figure out how this code is generated, |
|---|
| 121 |
and I definitely need help on this. There are also minor changes in the |
|---|
| 122 |
packet format. The basic structure still seems intact, however. |
|---|
| 123 |
|
|---|
| 124 |
That this document doesn't cover version 3 and 4 doesn't mean that it can't |
|---|
| 125 |
be used for building an ICQ clone, however. Mirabilis servers still supports |
|---|
| 126 |
version 2 clients (or at least they did when I last checked). There is |
|---|
| 127 |
reason to suspect that this might change some day, since the version 1 |
|---|
| 128 |
clients have been phased out, and are not useable any more. |
|---|
| 129 |
|
|---|
| 130 |
Furthermore are there some fields in the packets which I just couldn't figure |
|---|
| 131 |
out. You will find these marked "Unknown", and some typical value in the |
|---|
| 132 |
Content column. |
|---|
| 133 |
|
|---|
| 134 |
Many packet types are missing from this description for sure. If Mirabilis |
|---|
| 135 |
have used all multiples of 10 for their codes, there seem to be a lot of |
|---|
| 136 |
them missing. :-) |
|---|
| 137 |
|
|---|
| 138 |
There is much about the peer-to-peer communication that still is not |
|---|
| 139 |
clear to me. (This protocol seems not to have changed in ICQ98, however.) |
|---|
| 140 |
|
|---|
| 141 |
And finally, some of the features of ICQ have not even been addressed in this |
|---|
| 142 |
document. This includes file transfer and chat, but also some of the new |
|---|
| 143 |
features of ICQ98. |
|---|
| 144 |
|
|---|
| 145 |
If you can help in filling any of these gaps, or correct the information |
|---|
| 146 |
given here, please do not hesitate to contact me! I'd prefer if you |
|---|
| 147 |
send an e-mail to d95-mih@nada.kth.se with subject "ICQ Update". |
|---|
| 148 |
(Please note! Sending an empty mail with the subject "ICQ Update" does |
|---|
| 149 |
NOT mean that I'll mail you a copy of the spec when it's updated! If |
|---|
| 150 |
you are interested in keeping up to date with the ICQ specification, please |
|---|
| 151 |
join the mailing list instead.) |
|---|
| 152 |
|
|---|
| 153 |
Introduction |
|---|
| 154 |
------------ |
|---|
| 155 |
Communication with persons online is done through a direct TCP connection |
|---|
| 156 |
to that person. All other communication is done through UDP packets sent to |
|---|
| 157 |
the ICQ server. All UDP packets must be acknowledged by the receiver. |
|---|
| 158 |
Retransmission will occur in 10 seconds if a acknowledgement is not |
|---|
| 159 |
received. After 6 unsuccessfull transmissions, a B_MESSAGE_ACK message will |
|---|
| 160 |
be sent. The whole procedure is repeated 2 times. If there is still no |
|---|
| 161 |
reply, the ICQ client will assume the user to be disconneced. |
|---|
| 162 |
|
|---|
| 163 |
Before any communication between users can take place, the client must |
|---|
| 164 |
register at the server by logging in. During the login process, the client |
|---|
| 165 |
sends information about itself to the server, including its IP address, the |
|---|
| 166 |
TCP port reserved for ICQ, the user's password and the user's contact list. |
|---|
| 167 |
From now on, the client will assume itself to be 'connected', and will every |
|---|
| 168 |
now and then send a 'keep alive' message to the server. This keep alive |
|---|
| 169 |
message performs two functions: it makes the client sure that it still has |
|---|
| 170 |
access to the server, and it makes the server sure that the user is still |
|---|
| 171 |
online. By default, the client will 'connect' to the server on UDP port 4000. |
|---|
| 172 |
|
|---|
| 173 |
Functions such as sending messages to offline users, getting information |
|---|
| 174 |
about a user, searching for users in the ICQ Global Directory and changing |
|---|
| 175 |
password is done by sending UDP packets to the ICQ server. These packets do |
|---|
| 176 |
all follow a simple template, including the senders UIN, a special code |
|---|
| 177 |
indicating which function the server should perform, and optional |
|---|
| 178 |
parameters. |
|---|
| 179 |
|
|---|
| 180 |
When a user sends a message/URL/etc to another user that is currently |
|---|
| 181 |
connected, the ICQ client will establish a TCP connection directly to that |
|---|
| 182 |
user, and send the message using a format similar (but not identical) to the |
|---|
| 183 |
format used by the UDP packet messaging. After the message has been sent, |
|---|
| 184 |
the TCP connection is not closed, but instead kept open and used for future |
|---|
| 185 |
messages to that user. The connection is closed when either of the two users |
|---|
| 186 |
disconnect from their ICQ connection. |
|---|
| 187 |
|
|---|
| 188 |
Please note that throughout this document, all numbers are in hexadecimal |
|---|
| 189 |
unless stated otherwise. Integers consisting of more than one byte is stored |
|---|
| 190 |
with the least significant byte first, and the most significant byte last |
|---|
| 191 |
(as is usual on the PC/Intel architecture). All text strings etc are |
|---|
| 192 |
preceded by a two byte long LENGTH field, indicating the length of the |
|---|
| 193 |
string. All strings are also NULL terminated, i.e. followed by the byte with |
|---|
| 194 |
the value 00. When reading packets, either information may be used to |
|---|
| 195 |
determine the length of the string, but when sending both must be present. |
|---|
| 196 |
All strings are coded as usual MS Windows texts, i.e. in ISO Latin-1 |
|---|
| 197 |
charset, and lines terminated by CR/LF. (Not all strings may contain line |
|---|
| 198 |
breaks. This should be clear from context.) |
|---|
| 199 |
|
|---|
| 200 |
|
|---|
| 201 |
|
|---|
| 202 |
COMMUNICATION BETWEEN SERVER AND CLIENT USING UDP |
|---|
| 203 |
================================================= |
|---|
| 204 |
|
|---|
| 205 |
|
|---|
| 206 |
The UDP packet sent from the client to the server has the following general |
|---|
| 207 |
layout: |
|---|
| 208 |
|
|---|
| 209 |
Length Content (if fixed) Name Description |
|---|
| 210 |
------ ------------------ ---- ----------- |
|---|
| 211 |
2 bytes 02 00 VERSION Identifies the packet as an ICQ packet |
|---|
| 212 |
2 bytes xx xx COMMAND Code for service the server should provide |
|---|
| 213 |
2 bytes xx xx SEQ_NUM Sequence number |
|---|
| 214 |
4 bytes xx xx xx xx UIN The senders UIN |
|---|
| 215 |
variable PARAMETERS 0 or more parameters (depending on COMMAND) |
|---|
| 216 |
|
|---|
| 217 |
The UDP packet sent from the server to the client has the following general |
|---|
| 218 |
layout: |
|---|
| 219 |
|
|---|
| 220 |
Length Content (if fixed) Name Description |
|---|
| 221 |
------ ------------------ ---- ----------- |
|---|
| 222 |
2 bytes 02 00 VERSION Identifies the packet as an ICQ packet |
|---|
| 223 |
2 bytes xx xx COMMAND Code for service the server should provide |
|---|
| 224 |
2 bytes xx xx SEQ_NUM Sequence number |
|---|
| 225 |
variable PARAMETERS 0 or more parameters (depending on COMMAND) |
|---|
| 226 |
|
|---|
| 227 |
The VERSION field is present on all ICQ packets, and identifies the packet |
|---|
| 228 |
as a ICQ message. The SEQ_NUM contains a sequence number for the packet. All |
|---|
| 229 |
packets must have a unique sequence number (unless it is a retransmission). |
|---|
| 230 |
This is used to avoid confusion if a UDP packet is lost or duplicated (as |
|---|
| 231 |
may happen). Normally, the SEQ_NUM of the current packet is <the SEQ_NUM of |
|---|
| 232 |
the previous packet> + 1. Note that the server and the client has separate |
|---|
| 233 |
numbering, so that SEQ_NUM = 3 of a packet sent from the server is different |
|---|
| 234 |
from SEQ_NUM = 3 of a packet sent from the client. Note also that the server |
|---|
| 235 |
start counting on 00 00, and the client start counting on 01 00. |
|---|
| 236 |
|
|---|
| 237 |
The following commands are available for the client to send to the server: |
|---|
| 238 |
|
|---|
| 239 |
Code Name Description |
|---|
| 240 |
---- ---- ----------- |
|---|
| 241 |
0A 00 ACK Acknowledgement |
|---|
| 242 |
0E 01 SEND_MESSAGE Send message through server (to offline user) |
|---|
| 243 |
E8 03 LOGIN Login on server |
|---|
| 244 |
06 04 CONTACT_LIST Inform the server of my contact list |
|---|
| 245 |
1A 04 SEARCH_UIN Search for user using his/her UIN |
|---|
| 246 |
24 04 SEARCH_USER Search for user using his/her name or e-mail |
|---|
| 247 |
2E 04 KEEP_ALIVE Sent to indicate connection is still up |
|---|
| 248 |
38 04 SEND_TEXT_CODE Send special message to server as text |
|---|
| 249 |
4C 04 LOGIN_1 Sent during login |
|---|
| 250 |
60 04 INFO_REQ Request basic information about a user |
|---|
| 251 |
6A 04 EXT_INFO_REQ Request extended information about a user |
|---|
| 252 |
9C 04 CHANGE_PASSWORD Change the user's password |
|---|
| 253 |
D8 04 STATUS_CHANGE User has changed online status (Away etc) |
|---|
| 254 |
28 05 LOGIN_2 Sent during login |
|---|
| 255 |
|
|---|
| 256 |
Not yet described in detail (v0.1 of this document) |
|---|
| 257 |
0A 05 UPDATE_INFO Update my basic information |
|---|
| 258 |
B0 04 UPDATE_EXT_INFO Update my extended information |
|---|
| 259 |
3C 05 ADD_TO_LIST Add user to my contact list |
|---|
| 260 |
56 04 REQ_ADD_TO_LIST Request authorization to add to contact list |
|---|
| 261 |
BA 04 QUERY_SERVERS Query the server about address to other servers |
|---|
| 262 |
C4 04 QUERY_ADDONS Query the server about globally defined add-ons |
|---|
| 263 |
EC 04 NEW_USER_1 Ask for permission to add a new user |
|---|
| 264 |
FC 03 NEW_USER_REG Register a new user |
|---|
| 265 |
A6 04 NEW_USER_INFO Send basic information about a new user |
|---|
| 266 |
42 04 CMD_X1 *Unknown |
|---|
| 267 |
56 04 MSG_TO_NEW_USER Send a message to a user not on my contact list |
|---|
| 268 |
(this one is also used to request permission to add someone with 'authorize' |
|---|
| 269 |
status to your contact list) |
|---|
| 270 |
|
|---|
| 271 |
The following commands can be sent from the server to the client, either as |
|---|
| 272 |
a response to a client command, or to notify the client of some event. |
|---|
| 273 |
|
|---|
| 274 |
Code Name Description |
|---|
| 275 |
---- ---- ----------- |
|---|
| 276 |
0A 00 ACK Acknowledgement |
|---|
| 277 |
5A 00 LOGIN_REPLY Login reply |
|---|
| 278 |
6E 00 USER_ONLINE User on contact list is online/has changed online status |
|---|
| 279 |
78 00 USER_OFFLINE User on contact list has gone offline |
|---|
| 280 |
8C 00 USER_FOUND User record found matching search criteria |
|---|
| 281 |
DC 00 RECEIVE_MESSAGE Message sent while offline/through server |
|---|
| 282 |
A0 00 END_OF_SEARCH No more USER_FOUND will be sent |
|---|
| 283 |
18 01 INFO_REPLY Return basic information about a user |
|---|
| 284 |
22 01 EXT_INFO_REPLY Return extended information about a user |
|---|
| 285 |
A4 01 STATUS_UPDATE User on contact list has changed online status (Away etc) |
|---|
| 286 |
|
|---|
| 287 |
Not yet described in detail (v0.1 of this document) |
|---|
| 288 |
1C 02 REPLY_X1 *Unknown (returned during login) |
|---|
| 289 |
E6 00 REPLY_X2 *Unknown (confirm my UIN?) |
|---|
| 290 |
E0 01 UPDATE_REPLY Confirmation of basic information update |
|---|
| 291 |
C8 00 UPDATE_EXT_REPLY Confirmation of extended information update |
|---|
| 292 |
46 00 NEW_USER_UIN Confirmation of creation of new user and newly assigned UIN |
|---|
| 293 |
B4 00 NEW_USER_REPLY Confirmation of new user basic information |
|---|
| 294 |
82 00 QUERY_REPLY Response to QUERY_SEVERS or QUERY_ADDONS |
|---|
| 295 |
C2 01 SYSTEM_MESSAGE System message with URL'ed button |
|---|
| 296 |
|
|---|
| 297 |
The UDP messages will now be examined in closer detail. |
|---|
| 298 |
|
|---|
| 299 |
|
|---|
| 300 |
|
|---|
| 301 |
MESSAGES SENT BY THE CLIENT |
|---|
| 302 |
=========================== |
|---|
| 303 |
|
|---|
| 304 |
|
|---|
| 305 |
ACK (0A 00) Acknowledgement |
|---|
| 306 |
--- |
|---|
| 307 |
|
|---|
| 308 |
Parameters: None |
|---|
| 309 |
|
|---|
| 310 |
NOTE! Unlike all other commands, in ACK the field SEQ_NUM contains the |
|---|
| 311 |
sequence number of the *server's* packet the client wishes to acknowledge. |
|---|
| 312 |
Note further that an ACK should *not* be acknowledged! |
|---|
| 313 |
|
|---|
| 314 |
|
|---|
| 315 |
SEND_MESSAGE (0E 01) Send message through server (to offline user) |
|---|
| 316 |
------------ |
|---|
| 317 |
|
|---|
| 318 |
Parameters: |
|---|
| 319 |
Length Content (if fixed) Name Description |
|---|
| 320 |
------ ------------------ ---- ----------- |
|---|
| 321 |
4 bytes xx xx xx xx RECEIVER_UIN UIN of the user the message is sent to |
|---|
| 322 |
2 bytes (see below) MESSAGE_TYPE Type of message being sent |
|---|
| 323 |
2 bytes xx xx LENGTH Length of MESSAGE including NULL |
|---|
| 324 |
variable MESSAGE The message, ended by a NULL (00) |
|---|
| 325 |
|
|---|
| 326 |
MESSAGE_TYPE can be one of the following: |
|---|
| 327 |
01 00 - the message is a normal message |
|---|
| 328 |
04 00 - the message is an URL, and actually consists of two parts, |
|---|
| 329 |
separated by the code FE. |
|---|
| 330 |
The first part is the description of the URL, and the second part is the |
|---|
| 331 |
actual URL. |
|---|
| 332 |
|
|---|
| 333 |
|
|---|
| 334 |
LOGIN (E8 03) Login on server |
|---|
| 335 |
----- |
|---|
| 336 |
|
|---|
| 337 |
Parameters: |
|---|
| 338 |
Length Content (if fixed) Name Description |
|---|
| 339 |
------ ------------------ ---- ----------- |
|---|
| 340 |
4 bytes xx xx xx xx PORT The TCP port to use for incoming connections |
|---|
| 341 |
2 bytes xx xx LENGTH Length of PASSWORD including NULL |
|---|
| 342 |
variable PASSWORD The user's password + NULL (max 8 chars) |
|---|
| 343 |
4 bytes 78 00 00 00 X1 *Unknown |
|---|
| 344 |
4 bytes xx xx xx xx USER_IP The user's IP address |
|---|
| 345 |
1 byte 04 X2 *Unknown |
|---|
| 346 |
4 bytes xx xx xx xx STATUS Users online status (normally 00 00 00 00) |
|---|
| 347 |
4 bytes 02 00 00 00 X3 *Unknown |
|---|
| 348 |
2 bytes xx xx LOGIN_SEQ_NUM Login sequence number |
|---|
| 349 |
4 bytes 00 00 00 00 X4 *Unknown |
|---|
| 350 |
4 bytes 08 00 78 00 X5 *Unknown |
|---|
| 351 |
|
|---|
| 352 |
|
|---|
| 353 |
CONTACT_LIST (06 04) Inform the server of my contact list |
|---|
| 354 |
------------ |
|---|
| 355 |
|
|---|
| 356 |
Parameters: |
|---|
| 357 |
Length Content (if fixed) Name Description |
|---|
| 358 |
------ ------------------ ---- ----------- |
|---|
| 359 |
2 bytes xx xx NUM_CONTACTS Number of contacts following |
|---|
| 360 |
{4 bytes xx xx xx xx UIN UIN of user on contact list } |
|---|
| 361 |
The last field is repeated for as many users as NUM_CONTACTS indicate. |
|---|
| 362 |
|
|---|
| 363 |
The server will send online/offline notification to client only of users |
|---|
| 364 |
registered using CONTACT_LIST. |
|---|
| 365 |
|
|---|
| 366 |
|
|---|
| 367 |
SEARCH_UIN (1A 04) Search for user using his/her UIN |
|---|
| 368 |
---------- |
|---|
| 369 |
|
|---|
| 370 |
Parameters: |
|---|
| 371 |
Length Content (if fixed) Name Description |
|---|
| 372 |
------ ------------------ ---- ----------- |
|---|
| 373 |
2 bytes xx xx SEARCH_SEQ_NUM Search sequence number |
|---|
| 374 |
4 bytes xx xx xx xx SEARCHED_UIN The UIN to search for |
|---|
| 375 |
|
|---|
| 376 |
The SEARCH_SEQ_NUM should be a unique number, to distinguish from other |
|---|
| 377 |
searches. The reply from the server will contain the SEARCH_SEQ_NUM of the |
|---|
| 378 |
search, to facitilate matching query and answer. |
|---|
| 379 |
|
|---|
| 380 |
|
|---|
| 381 |
SEARCH_USER (24 04) Search for user using his/her name or e-mail |
|---|
| 382 |
----------- |
|---|
| 383 |
|
|---|
| 384 |
Parameters: |
|---|
| 385 |
Length Content (if fixed) Name Description |
|---|
| 386 |
------ ------------------ ---- ----------- |
|---|
| 387 |
2 bytes xx xx SEARCH_SEQ_NUM Search sequence number |
|---|
| 388 |
2 bytes xx xx LENGTH Length of NICK_NAME including NULL |
|---|
| 389 |
variable NICK_NAME Nick name to search for, NULL terminated |
|---|
| 390 |
2 bytes xx xx LENGTH Length of FIRST_NAME including NULL |
|---|
| 391 |
variable FIRST_NAME First name to search for, NULL terminated |
|---|
| 392 |
2 bytes xx xx LENGTH Length of LAST_NAME including NULL |
|---|
| 393 |
variable LAST_NAME Nick name to search for, NULL terminated |
|---|
| 394 |
2 bytes xx xx LENGTH Length of E_MAIL including NULL |
|---|
| 395 |
variable E_MAIL E-mail to search for, NULL terminated |
|---|
| 396 |
|
|---|
| 397 |
Note that search fields (NICK_NAME, FIRST_NAME, LAST_NAME, E_MAIL) may be |
|---|
| 398 |
empty, but not all at the same time, i.e. at least one field must contain |
|---|
| 399 |
data. Note also that you may only search either on E_MAIL (in which the |
|---|
| 400 |
other fields must be empty), or on name (in which E_MAIL must be empty, and |
|---|
| 401 |
one or more of the other fields must contain data). |
|---|
| 402 |
|
|---|
| 403 |
|
|---|
| 404 |
KEEP_ALIVE (2E 04) Sent to indicate connection is still up |
|---|
| 405 |
---------- |
|---|
| 406 |
|
|---|
| 407 |
Parameters: None |
|---|
| 408 |
|
|---|
| 409 |
This command should be sent at regular intervals (normally every 2 minutes, |
|---|
| 410 |
or 120 seconds) from the client to the server. |
|---|
| 411 |
|
|---|
| 412 |
|
|---|
| 413 |
SEND_TEXT_CODE (38 04) Send special message to server as text |
|---|
| 414 |
-------------- |
|---|
| 415 |
|
|---|
| 416 |
Parameters: |
|---|
| 417 |
Length Content (if fixed) Name Description |
|---|
| 418 |
------ ------------------ ---- ----------- |
|---|
| 419 |
2 bytes xx xx LENGTH Length of TEXT_CODE including NULL |
|---|
| 420 |
variable TEXT_CODE Message to send to server, NULL terminated |
|---|
| 421 |
2 bytes xx xx X1 *Unknown (code, usually 04 00 or 05 00) |
|---|
| 422 |
|
|---|
| 423 |
The TEXT_CODE can contain for instance: |
|---|
| 424 |
"B_USER_DISCONNECTED" (in which case the X1 field should containt 05 00) if |
|---|
| 425 |
the user has disconnected. |
|---|
| 426 |
"B_MESSAGE_ACK" (in which case the X1 field should containt 05 00) if the |
|---|
| 427 |
client has problem connecting to the server. This is a request for the |
|---|
| 428 |
server to answer immediately to the client. |
|---|
| 429 |
|
|---|
| 430 |
|
|---|
| 431 |
LOGIN_1 (4C 04) Sent during login |
|---|
| 432 |
------- |
|---|
| 433 |
|
|---|
| 434 |
Parameters: None |
|---|
| 435 |
|
|---|
| 436 |
This is sent during login. The exact purpose of this command is *Unknown. |
|---|
| 437 |
|
|---|
| 438 |
|
|---|
| 439 |
INFO_REQ (60 04) Request basic information about a user |
|---|
| 440 |
-------- |
|---|
| 441 |
|
|---|
| 442 |
Parameters: |
|---|
| 443 |
Length Content (if fixed) Name Description |
|---|
| 444 |
------ ------------------ ---- ----------- |
|---|
| 445 |
2 bytes xx xx INFO_SEQ_NUM Information sequential number |
|---|
| 446 |
4 bytes xx xx xx xx QUERY_UIN UIN of user to request information about |
|---|
| 447 |
|
|---|
| 448 |
The server will respond with a INFO_REPLY, with the same INFO_SEQ_NUM. |
|---|
| 449 |
|
|---|
| 450 |
|
|---|
| 451 |
EXT_INFO_REQ (6A 04) Request extended information about a user |
|---|
| 452 |
------------ |
|---|
| 453 |
|
|---|
| 454 |
Parameters: |
|---|
| 455 |
Length Content (if fixed) Name Description |
|---|
| 456 |
------ ------------------ ---- ----------- |
|---|
| 457 |
2 bytes xx xx INFO_SEQ_NUM Information sequential number |
|---|
| 458 |
4 bytes xx xx xx xx QUERY_UIN UIN of user to request information about |
|---|
| 459 |
|
|---|
| 460 |
The server will respond with a EXT_INFO_REPLY, with the same INFO_SEQ_NUM. |
|---|
| 461 |
|
|---|
| 462 |
|
|---|
| 463 |
CHANGE_PASSWORD (9C 04) Change the user's password |
|---|
| 464 |
--------------- |
|---|
| 465 |
|
|---|
| 466 |
Parameters: |
|---|
| 467 |
Length Content (if fixed) Name Description |
|---|
| 468 |
------ ------------------ ---- ----------- |
|---|
| 469 |
2 bytes xx xx PASSWORD_SEQ_NUM Password changing sequential number |
|---|
| 470 |
2 bytes xx xx LENGTH Length of NEW_PASSWORD including NULL |
|---|
| 471 |
variable NEW_PASSWORD The new password, NULL terminated (max 8 chars) |
|---|
| 472 |
|
|---|
| 473 |
|
|---|
| 474 |
STATUS_CHANGE (D8 04) User has changed online status (Away etc) |
|---|
| 475 |
------------- |
|---|
| 476 |
|
|---|
| 477 |
Parameters: |
|---|
| 478 |
Length Content (if fixed) Name Description |
|---|
| 479 |
------ ------------------ ---- ----------- |
|---|
| 480 |
4 bytes (see below) STATUS User's online status (Away etc) |
|---|
| 481 |
|
|---|
| 482 |
The STATUS may take four different values: |
|---|
| 483 |
00 00 00 00 = Online/connected |
|---|
| 484 |
01 00 00 00 = Away |
|---|
| 485 |
11 00 00 00 = Do Not Disturb (DND) |
|---|
| 486 |
00 01 00 00 = Invisible |
|---|
| 487 |
|
|---|
| 488 |
|
|---|
| 489 |
LOGIN_2 (28 05) Sent during login |
|---|
| 490 |
------- |
|---|
| 491 |
|
|---|
| 492 |
Parameters: |
|---|
| 493 |
Length Content (if fixed) Name Description |
|---|
| 494 |
------ ------------------ ---- ----------- |
|---|
| 495 |
1 byte 00 X1 *Unknown |
|---|
| 496 |
|
|---|
| 497 |
|
|---|
| 498 |
|
|---|
| 499 |
MESSAGES SENT BY THE SERVER |
|---|
| 500 |
=========================== |
|---|
| 501 |
|
|---|
| 502 |
|
|---|
| 503 |
ACK (0A 00) Acknowledgement |
|---|
| 504 |
--- |
|---|
| 505 |
|
|---|
| 506 |
Parameters: None |
|---|
| 507 |
|
|---|
| 508 |
NOTE! Unlike all other commands, in ACK the field SEQ_NUM contains the |
|---|
| 509 |
sequence number of the *client's* packet the server acknowledges. Note |
|---|
| 510 |
further that an ACK should *not* be acknowledged! |
|---|
| 511 |
|
|---|
| 512 |
|
|---|
| 513 |
LOGIN_REPLY (5A 00) Login reply |
|---|
| 514 |
----------- |
|---|
| 515 |
|
|---|
| 516 |
Parameters: |
|---|
| 517 |
Length Content (if fixed) Name Description |
|---|
| 518 |
------ ------------------ ---- ----------- |
|---|
| 519 |
4 bytes xx xx xx xx USER_UIN The user's UIN |
|---|
| 520 |
4 bytes xx xx xx xx USER_IP The user's IP address |
|---|
| 521 |
2 bytes xx xx LOGIN_SEQ_NUM Login sequence number |
|---|
| 522 |
4 bytes 01 00 01 00 X1 *Unknown |
|---|
| 523 |
4 bytes xx 00 16 00 X2 *Unknown (xx=19 or 18) |
|---|
| 524 |
4 bytes 8C 00 00 00 X3 *Unknown |
|---|
| 525 |
4 bytes 78 00 05 00 X4 *Unknown |
|---|
| 526 |
6 bytes 0A 00 05 00 01 00 X5 *Unknown |
|---|
| 527 |
|
|---|
| 528 |
This is sent from the server upon receipt of a LOGIN. The LOGIN_SEQ_NUM is |
|---|
| 529 |
the same as in the corresponding LOGIN. |
|---|
| 530 |
|
|---|
| 531 |
|
|---|
| 532 |
USER_ONLINE (6E 00) User on contact list is online/has changed online status |
|---|
| 533 |
----------- |
|---|
| 534 |
|
|---|
| 535 |
Parameters: |
|---|
| 536 |
Length Content (if fixed) Name Description |
|---|
| 537 |
------ ------------------ ---- ----------- |
|---|
| 538 |
4 bytes xx xx xx xx REMOTE_UIN The UIN of the user who has logged in |
|---|
| 539 |
4 bytes xx xx xx xx REMOTE_IP The IP address of the user |
|---|
| 540 |
4 bytes xx xx xx xx REMOTE_PORT The TCP port of the user |
|---|
| 541 |
4 bytes xx xx xx xx REMOTE_REAL_IP The actual IP address of the user |
|---|
| 542 |
1 byte 04 X1 *Unknown |
|---|
| 543 |
4 bytes xx xx xx xx STATUS New status of the user |
|---|
| 544 |
4 bytes 02 00 00 00 X2 *Unkown |
|---|
| 545 |
|
|---|
| 546 |
The REMOTE_IP is the "outer" IP address of the remote user, the |
|---|
| 547 |
REMOTE_REAL_IP is the "inner" IP address. These two will be identical unless |
|---|
| 548 |
the remote user is behind a firewall. The REMOTE_IP is the "official" IP |
|---|
| 549 |
address, as shown e.g. by the Info box in the client. The REMOTE_PORT is the |
|---|
| 550 |
TCP port number to use when the client wishes to open a direct connection |
|---|
| 551 |
to the remote user. |
|---|
| 552 |
|
|---|
| 553 |
|
|---|
| 554 |
USER_OFFLINE (78 00) User on contact list has gone offline |
|---|
| 555 |
------------ |
|---|
| 556 |
|
|---|
| 557 |
Parameters: |
|---|
| 558 |
Length Content (if fixed) Name Description |
|---|
| 559 |
------ ------------------ ---- ----------- |
|---|
| 560 |
4 bytes xx xx xx xx REMOTE_UIN The UIN of the user who has logged out |
|---|
| 561 |
|
|---|
| 562 |
|
|---|
| 563 |
USER_FOUND (8C 00) User record found matching search criteria |
|---|
| 564 |
---------- |
|---|
| 565 |
|
|---|
| 566 |
Parameters: |
|---|
| 567 |
Length Content (if fixed) Name Description |
|---|
| 568 |
------ ------------------ ---- ----------- |
|---|
| 569 |
2 bytes xx xx SEARCH_SEQ_NUM Search sequence number |
|---|
| 570 |
4 bytes xx xx xx xx FOUND_UIN Found user's UIN |
|---|
| 571 |
2 bytes xx xx LENGTH Length of NICK_NAME including NULL |
|---|
| 572 |
variable NICK_NAME Found user's nick name, NULL terminated |
|---|
| 573 |
2 bytes xx xx LENGTH Length of FIRST_NAME including NULL |
|---|
| 574 |
variable FIRST_NAME Found user's first name, NULL terminated |
|---|
| 575 |
2 bytes xx xx LENGTH Length of LAST_NAME including NULL |
|---|
| 576 |
variable LAST_NAME Found user's last name, NULL terminated |
|---|
| 577 |
2 bytes xx xx LENGTH Length of E_MAIL including NULL |
|---|
| 578 |
variable E_MAIL Found user's e-mail, NULL terminated |
|---|
| 579 |
1 byte xx AUTHORIZE User's authorization status |
|---|
| 580 |
|
|---|
| 581 |
For each user found matching the criterion, a USER_FOUND will be returned. |
|---|
| 582 |
When all USER_FOUND's have been sent, the server will send an END_OF_SEARCH. |
|---|
| 583 |
If no users where found matching the criterion, an END_OF_SEARCH will be |
|---|
| 584 |
sent immediately, and no USER_FOUND will be sent. The AUTHORIZE determine |
|---|
| 585 |
wether the user allow anyone to include him/her on their contact list, or |
|---|
| 586 |
wether the user must accept first. Possible values of AUTHORIZE: |
|---|
| 587 |
00 = The user must authorize the client to include him/her on the client's |
|---|
| 588 |
contact list |
|---|
| 589 |
01 = The user allows anyone to include him/her on their contact list |
|---|
| 590 |
|
|---|
| 591 |
|
|---|
| 592 |
RECEIVE_MESSAGE (DC 00) Message sent while offline/through server |
|---|
| 593 |
--------------- |
|---|
| 594 |
|
|---|
| 595 |
Parameters: |
|---|
| 596 |
Length Content (if fixed) Name Description |
|---|
| 597 |
------ ------------------ ---- ----------- |
|---|
| 598 |
4 bytes xx xx xx xx REMOTE_UIN The sending user's UIN |
|---|
| 599 |
2 bytes xx xx YEAR The year the message was sent |
|---|
| 600 |
1 byte xx MONTH The month the message was sent |
|---|
| 601 |
1 byte xx DAY The day of the month the message was sent |
|---|
| 602 |
1 byte xx HOUR The hour the message was sent in GMT |
|---|
| 603 |
1 byte xx MINUTE The minute the message was sent |
|---|
| 604 |
2 bytes xx xx TYPE The type of message (message, URL, etc) |
|---|
| 605 |
2 bytes xx xx LENGTH Length of MESSAGE including NULL |
|---|
| 606 |
variable MESSAGE The message sent, NULL terminated |
|---|
| 607 |
|
|---|
| 608 |
Note that the HOUR contains the local time - 1 (unless GMT is involved |
|---|
| 609 |
somehow?). The TYPE identifies the type of message this is: |
|---|
| 610 |
01 00 = Normal message |
|---|
| 611 |
04 00 = URL (MESSAGE contains first the description, then a FE, and then |
|---|
| 612 |
the actual URL) |
|---|
| 613 |
0C 00 = 'You were added' message. (MESSAGE contains: <nick name> FE <first |
|---|
| 614 |
name> FE <last name> FE <e-mail> FE <ASCII authorize>. The <ASCII |
|---|
| 615 |
authorize> is '1' (31) if the user allows anyone to add him/her to their |
|---|
| 616 |
contact list, and '0' (30) otherwise.) |
|---|
| 617 |
|
|---|
| 618 |
|
|---|
| 619 |
END_OF_SEARCH (A0 00) No more USER_FOUND will be sent |
|---|
| 620 |
------------- |
|---|
| 621 |
|
|---|
| 622 |
Parameters: |
|---|
| 623 |
Length Content (if fixed) Name Description |
|---|
| 624 |
------ ------------------ ---- ----------- |
|---|
| 625 |
2 bytes xx xx SEARCH_SEQ_NUM Search sequence number |
|---|
| 626 |
1 byte xx MORE_FOUND More users found but not displayed? |
|---|
| 627 |
|
|---|
| 628 |
If MORE_FOUND is 00, then the returned USER_FOUND's contain information |
|---|
| 629 |
about all matching users. If MORE_FOUND is 01 however, then the server has |
|---|
| 630 |
found more users matching, but will not display more matches. The limit is |
|---|
| 631 |
drawn by 40 users. If a search request results in more than 40 matches, |
|---|
| 632 |
only the 40 first will be sent to the client, and MORE_FOUND will be set to |
|---|
| 633 |
01. |
|---|
| 634 |
|
|---|
| 635 |
|
|---|
| 636 |
INFO_REPLY (18 01) Return basic information about a user |
|---|
| 637 |
---------- |
|---|
| 638 |
|
|---|
| 639 |
Parameters: |
|---|
| 640 |
Length Content (if fixed) Name Description |
|---|
| 641 |
------ ------------------ ---- ----------- |
|---|
| 642 |
2 bytes xx xx INFO_SEQ_NUM Information sequence number |
|---|
| 643 |
4 bytes xx xx xx xx REMOTE_UIN The remote user's UIN |
|---|
| 644 |
2 bytes xx xx LENGTH Lenght of NICK_NAME including NULL |
|---|
| 645 |
variable NICK_NAME The remote user's nick name |
|---|
| 646 |
2 bytes xx xx LENGTH Lenght of FIRST_NAME including NULL |
|---|
| 647 |
variable FIRST_NAME The remote user's first name |
|---|
| 648 |
2 bytes xx xx LENGTH Lenght of LAST_NAME including NULL |
|---|
| 649 |
variable LAST_NAME The remote user's last name |
|---|
| 650 |
2 bytes xx xx LENGTH Lenght of E_MAIL including NULL |
|---|
| 651 |
variable E_MAIL The remote user's e-mail |
|---|
| 652 |
1 byte xx AUTHORIZE User's authorization status |
|---|
| 653 |
|
|---|
| 654 |
Note that the parameters are identical to command USER_FOUND (8C 00). For |
|---|
| 655 |
more information about the fields, see USER_FOUND. |
|---|
| 656 |
|
|---|
| 657 |
EXT_INFO_REPLY (22 01) Return extended information about a user |
|---|
| 658 |
-------------- |
|---|
| 659 |
|
|---|
| 660 |
Parameters: |
|---|
| 661 |
Length Content (if fixed) Name Description |
|---|
| 662 |
------ ------------------ ---- ----------- |
|---|
| 663 |
2 bytes xx xx INFO_SEQ_NUM Information sequence number |
|---|
| 664 |
4 bytes xx xx xx xx REMOTE_UIN The remote user's UIN |
|---|
| 665 |
2 bytes xx xx LENGTH Lenght of CITY including NULL |
|---|
| 666 |
variable CITY The remote user's city |
|---|
| 667 |
2 bytes xx xx COUNTRY_CODE The remote user's country code |
|---|
| 668 |
1 byte xx COUNTRY_STATUS Indicates if COUNTRY_CODE is entered or not |
|---|
| 669 |
2 bytes xx xx LENGTH Lenght of STATE including NULL |
|---|
| 670 |
variable STATE The remote user's state (USA only) |
|---|
| 671 |
2 bytes xx xx AGE The remote user's age |
|---|
| 672 |
1 byte xx SEX The remote user's sex |
|---|
| 673 |
2 bytes xx xx LENGTH Lenght of PHONE including NULL |
|---|
| 674 |
variable PHONE The remote user's city |
|---|
| 675 |
2 bytes xx xx LENGTH Lenght of HOME_PAGE including NULL |
|---|
| 676 |
variable HOME_PAGE The remote user's city |
|---|
| 677 |
2 bytes xx xx LENGTH Lenght of ABOUT including NULL |
|---|
| 678 |
variable ABOUT The remote user's city |
|---|
| 679 |
|
|---|
| 680 |
The code used in COUNTRY_CODE is the international telephone prefix, e.g. |
|---|
| 681 |
01 00 (1) for the USA, 2C 00 (44) for the UK, 2E 00 (46) for Sweden, etc. |
|---|
| 682 |
COUNTRY_STATUS is normally FE, unless the remote user has not entered a |
|---|
| 683 |
country, in which casse COUNTRY_CODE will be FF FF, and COUNTRY_STATUS will |
|---|
| 684 |
be 9C. The field AGE has the value FF FF if the user has not entered his/her |
|---|
| 685 |
age. The field SEX has three (!) possible values: |
|---|
| 686 |
00 = Not specified |
|---|
| 687 |
01 = Female |
|---|
| 688 |
02 = Male |
|---|
| 689 |
The ABOUT field is an optional free form field that allows the user to make |
|---|
| 690 |
a personal presentation of himself/herself. |
|---|
| 691 |
|
|---|
| 692 |
|
|---|
| 693 |
STATUS_UPDATE (A4 01) User on contact list has changed online status (Away etc) |
|---|
| 694 |
------------- |
|---|
| 695 |
|
|---|
| 696 |
Parameters: |
|---|
| 697 |
Length Content (if fixed) Name Description |
|---|
| 698 |
------ ------------------ ---- ----------- |
|---|
| 699 |
4 bytes xx xx xx xx REMOTE_UIN UIN of the user whos status has changed |
|---|
| 700 |
4 bytes xx xx xx xx STATUS The new online status of the user |
|---|
| 701 |
|
|---|
| 702 |
The online status in STATUS is the same as used in STATUS_CHANGE (D8 04). |
|---|
| 703 |
See STATUS_CHANGE for details. |
|---|
| 704 |
|
|---|
| 705 |
|
|---|
| 706 |
|
|---|
| 707 |
COMMUNICATION BETWEEN TWO CLIENTS USING TCP (Peer to peer mode) |
|---|
| 708 |
=============================================================== |
|---|
| 709 |
|
|---|
| 710 |
When a user wishes to send a message, an URL etc, to another user (called |
|---|
| 711 |
the "remote" user as opposite to the "local" user), the local user first |
|---|
| 712 |
checks to see if a TCP connection already is established to that user. If |
|---|
| 713 |
so is the case, then that connection will be used. If not, the user checks |
|---|
| 714 |
the remote users IP address and port number (information sent to the user |
|---|
| 715 |
from the server when the remote user logged in), and makes a connection to |
|---|
| 716 |
that address. Typical port numbers are in the range 1200-1300 (decimal). |
|---|
| 717 |
When a new connection is formed, a CHANNEL_INIT message must be sent. From |
|---|
| 718 |
there on, however, every time the user wishes to send a message, a |
|---|
| 719 |
CHANNEL_MESSAGE is sent. All messages sent must be acknowledged by the other |
|---|
| 720 |
side, using CHANNEL_ACK. Furthermore, all messages is replied to by another |
|---|
| 721 |
message from the receiver - which most often is empty, unless the user has |
|---|
| 722 |
posted a Away/DND message, in case this will be sent as a reply. |
|---|
| 723 |
|
|---|
| 724 |
The TCP communication is similar to the UDP communication, in that all |
|---|
| 725 |
communication is done trough separate packets (often, but now always |
|---|
| 726 |
associated with individual TCP packets). Each packet must contain the |
|---|
| 727 |
packet's length (excluding the length count) as the first two bytes. Most |
|---|
| 728 |
messages contains the senders UIN as the next field. |
|---|
| 729 |
|
|---|
| 730 |
CHANNEL_INIT Initiate inter-user communication using TCP |
|---|
| 731 |
------------ |
|---|
| 732 |
|
|---|
| 733 |
Parameters: |
|---|
| 734 |
Length Content (if fixed) Name Description |
|---|
| 735 |
------ ------------------ ---- ----------- |
|---|
| 736 |
2 bytes 1A 00 LENGTH Length of this packet |
|---|
| 737 |
1 byte FF INIT_IDENT Identifies this packet as an initiation |
|---|
| 738 |
4 bytes 02 00 00 00 X1 *Unknown |
|---|
| 739 |
4 bytes 00 00 00 00 X2 *Unknown |
|---|
| 740 |
4 bytes xx xx xx xx MY_UIN The local user's UIN |
|---|
| 741 |
4 bytes xx xx xx xx MY_IP The user's IP address |
|---|
| 742 |
4 bytes xx xx xx xx MY_IP_REAL The user's actual IP address |
|---|
| 743 |
1 byte 04 X3 *Unknown |
|---|
| 744 |
4 bytes xx xx xx xx MY_PORT The user's TCP port for incoming messages |
|---|
| 745 |
|
|---|
| 746 |
Note that the port used for the "outgoing" connection is different from |
|---|
| 747 |
MY_PORT, the port other clients use to connect to this client. For the |
|---|
| 748 |
difference between MY_IP and MY_IP_REAL, see USER_ONLINE. |
|---|
| 749 |
|
|---|
| 750 |
CHANNEL_MESSAGE Send message to online user |
|---|
| 751 |
------------ |
|---|
| 752 |
|
|---|
| 753 |
Parameters: |
|---|
| 754 |
Length Content (if fixed) Name Description |
|---|
| 755 |
------ ------------------ ---- ----------- |
|---|
| 756 |
2 bytes xx xx LENGTH Length of this packet |
|---|
| 757 |
4 bytes xx xx xx xx UIN The local user's UIN |
|---|
| 758 |
2 bytes 02 00 VERSION Identifies this as a ICQ packet |
|---|
| 759 |
2 bytes EE 07 MSG_COMMAND The message type for CHANNEL_MESSAGE |
|---|
| 760 |
2 bytes 00 00 X1 *Unknown |
|---|
| 761 |
4 bytes xx xx xx xx UIN_2 The local user's UIN |
|---|
| 762 |
2 bytes xx xx TYPE Message type |
|---|
| 763 |
2 bytes xx xx LENGTH Length of MESSAGE including NULL |
|---|
| 764 |
variable MESSAGE The message to be sent, NULL terminated |
|---|
| 765 |
4 bytes xx xx xx xx MY_IP_REAL The user's actual IP address |
|---|
| 766 |
4 bytes xx xx xx xx MY_IP The user's IP address |
|---|
| 767 |
4 bytes xx xx xx xx PORT The user's TCP port for incoming messages |
|---|
| 768 |
1 byte 04 X2 *Unknown |
|---|
| 769 |
2 bytes 00 00 X3 *Unknown |
|---|
| 770 |
2 bytes xx xx CMD_TYPE Identifies message as new message or reply |
|---|
| 771 |
4 bytes xx xx xx xx X4 *Unknown (checksum? sequence number?) |
|---|
| 772 |
|
|---|
| 773 |
The TYPE is the same as described in RECEIVE_MESSAGE. The difference between |
|---|
| 774 |
MY_IP and MY_IP_REAL is described in USER_ONLINE. The CMD_TYPE can have two |
|---|
| 775 |
possible values: |
|---|
| 776 |
10 00 = This is a new ('real', user initiated) message |
|---|
| 777 |
00 00 = This is an auto reply |
|---|
| 778 |
The auto reply is sent as an acknowledgement to all 'real' messages. They |
|---|
| 779 |
usually contains an empty message, but if the remote user is 'Away' or in |
|---|
| 780 |
DND mode, the reply will contain the Away/DND message. The X4 field is a |
|---|
| 781 |
bit tricky. It is always between 00 FF FF FF and FF FF FF FF, but the exact |
|---|
| 782 |
function of the field is unknown. |
|---|