tech stuff warning! some knowledge about msn p2p protocol required. The official client increases the client field globally - this is more obvious on DC invites where you receive a invite after accepting the file. For example
<<< DC Invite - identifier 12345
>>> "I don't care" message
(not a decline, just some random wrongness - aka internal development bug)<<< some data message - identifier 12346
<<< another data message - identifier 12347
<<< "I didn't hear you, so i assume you haven't replied me and tell you that with an annoying message with flag 4"
--identifier 12348
<<< last data message - identifier 12349
>>> (data ack)
<<< bye msnslp message - identifier 12350
>>> (bye ack)
<<< "I'm still waiting for a reply to my DC invite, and you hadn't replied my other annoying message, so if you don't reply everything, even those messages that you dropped, in a minute i will stop sending data because i'm evil. Yes, this is flag 4." - identifier 12351
I wrote a DC invite handler (because declining is the same as canceling - that doesn't mean that i will implement DC now), but i found that i can't track those flag 4 messages (i have to, even if i reply the original invite message the right way.. there could be some big network latency that makes me receive both invite and flag 4 message).
I considered a "last identifier" variable on P2PUser, but that seems hacky and i'm not sure if this applies to everything (DP/CE senders/receivers included)
Relying on identifiers sucks, but it's the only way to identify negotiation messages. As I always say,
some people died messing with
direct connect/identifiers.