HANDSHAKE PACKET:
ff		Handshake byte
03 00 00 00	Version
00 00 00 00	0x00000000
xx xx xx xx	UIN
xx xx xx xx	IP a
xx xx xx xx	IP b
04		0x04
xx xx xx xx	Port 

MESSAGE PACKET:
xx xx xx xx	UIN
03 00		Version
ee 07 00 00	Send message command
xx xx xx xx	UIN
xx xx		Type of message**
xx xx		Length of message
vari.		Message
xx xx xx xx	IP a
xx xx xx xx	IP b
xx xx xx xx	Main TCP port
04		0x04
xx xx xx xx	Status*
xx xx xx xx	Sequence

MESSAGE ACK PACKET:
xx xx xx xx	UIN
03 00		Version
da 07 00 00	Acknowledge command
xx xx xx xx	UIN
xx xx		Type of message**
xx xx		Length of Away Message
vari.		Away Message
xx xx xx xx	IP a
xx xx xx xx	IP b
xx xx xx xx	Main TCP port
04 		0x04
xx xx xx xx	Status*
xx xx xx xx	Sequence

SEND AWAY MESSAGE:
xx xx xx xx	UIN
04 00		Version
da 07 00 00	Acknowledge command	
xx xx xx xx	UIN
xx xx		Message Type
xx xx		Away Message length
vari.		Away Message
xx xx xx xx	IP a
xx xx xx xx	IP b
xx xx xx xx	Main TCP Port
04		0x04
xx xx xx xx	Status*
xx xx xx xx	Sequence 


* Status is one of the following (the user's current status):
  - 00 00 00 00	Online
  - 04 00 00 00	Away
  - 0E 00 00 00	Not Available
  - 0A 00 00 00	Do Not Disturb
  - 09 00 00 00	Occupied

**Message Type is one of the following:
  - 01 00	Normal Message/Ack
  - 02 00	Chat Request/Ack
  - 03 00	File Transfer Request/Ack
  - 04 00	URL Transfer
  - E8 03	Read Away Message

To begin TCP connection, connect() to the "target's" port and IP which is
obtained from the ICQ server.  Send a handshake packet across that socket. 
The channel is now ready to send messages, chat requests, etc.  You must
also monitor that socket for incoming data, because the other client will
use the same connection to send your client information.

Once the handshaking is done, you can send message packets back and forth. 
Clients from Mirabilis will wait with the "spinning face" until the MESSAGE
ACK packet returns.  Thus, when you receive a message packet, you MUST
return a MESSAGE ACK packet.  If the user is away, then you can use the
"away message" area to send an away message, and you must then set the
status appropriately, which will flag the other client to show the
information.

Additional Notes:
For some reason, v4 must have some different setting in the Handshake
packet.  The message packet for v3 and v4 are exactly identical, but I
haven't been able to find a handshake packet sent by a v4 client.

In fact, a Windows client will send UDP messages until YOUR client makes the
TCP connection.  Any ideas?
