Hi, after reading some Gnutella servants source code [1] and talking with some other developers, it seems that model number 3 (select()-based or poll()-based) is the common tactic.
I think this model does fit to the needs of a gnutella servant (fast response and handling a high amount connections) and it perfectly supports a flexibel object orientated programming concept (okay, I personally love C++ and object orientated programming) [2].
Greets, Moak
[1] Gnutelladev -
http://www.gnutelladev.com/source.html
[2]
Programming a Gnutella Client, part II: network core