[dcc2] SIDs and connections to self.
Szymon Stefanek
pragma at kvirc.net
Sun Jun 27 09:29:59 EDT 2004
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Sunday 27 June 2004 09:17, myndzi wrote:
> The other option is simply to ensure that all the required info
> remains in the message. That way you don't have to "remember"
> anything, merely react to incoming data. That may be the 'way to go'.
> Sorry for the mass posting ;P
I guess that the applications WILL always have some private data to remember.
A "mental" schema for implementing the data structure lookup might be the
following:
You keep a hashtable keyed to the triple (<SID>,<NICK>,<MID>) where <SID> is
the identifier of the session, <NICK> is the REMOTE nickname and <MID> is the
lasts message counter SENT.
To initiate a DCC2 handshake to <NICK>:
- generate a <SID>
- memorize your data keyed to (<SID>,<NICK>,1) in the hash
- send the first handshake message by using <SID> and <MID>=1
When you receive a message (<SID>,<MID>) from <NICK> you proceed as follows:
- If <MID>=1 then this is a new session to handle.
It may have been initiated by a remote party or yourself, but you shouldn't
care about that. Memorize your data structure keyed to (<SID>,<NICK>,2)
and continue the handshake by sending a message with that triple.
- Search the triple <SID>,<MID> - 1 ,<nick> in the hash.
If you have a match then this is a valid session initiated earlier. If <MID>
is ODD then the session has been initiated by yourself , otherwise it has
been initiated by a remote party. Remove the data structure from the hash
and rememorize it again keyed to (<SID>,<NICK>,<MID>+1). Continue
the handshake by sending a message with <MID>+1.
- Error: discard the message.
The bad news is that a remote party can mess up in several ways.
For example, if it receives a message with MID=1 and sends the reply without
increasing it (still with MID 1) then you may end up in an infinite loop.
For this reason when you receive a message with (<SID>,<MID> = 1) from <NICK>
you should perform this additional check:
- If there exists a data structure keyed to (<SID>,<N>,<NICK>) with <N>
GREATER OR EQUAL to <MID> then:
- If <NICK> is NOT you, then the message is an error.
- If <NICK> is you, then:
- If <N> is EQUAL to <MID> then it is a "dcc-to-self" session.
- If <N> is GREATER than <MID> you have a bug in your program.
The rules above can be also implemented cleanly using two hashes: one for the
locally generated sessions and one for the remotely generated. In this case
the number of lookups increases.
- --
Szymon Stefanek
- ------------------------------------------------------------------------------
- -
- - Energy of the gods, adrenaline surge
- - Won't stop til I hit the ground, I'm on my way for sure
- - Up here in the air, this will never hurt
- - I'm on my way to impact, taste the high speed dirt
- -
- ------------------------------------------------------------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
iD8DBQFA3svXRu+qkQYW8QERAnVYAKDUOL/ZYShrcqPgleV5S6NDOCD4bgCfWI2R
Whev3+Wpuz1yk2qmCYUdndc=
=cMSv
-----END PGP SIGNATURE-----
More information about the dcc2
mailing list