[Stefan Sperling] > This doesn't make any sense. > I don't understand how an OS can allow a user process to break > a system service simply by binding a socket to the same port.
And yet ... http://msdn.microsoft.com/en-us/library/ms740621%28VS.85%29.aspx Once the second socket has successfully bound, the behavior for all sockets bound to that port is indeterminate. For example, if all of the sockets on the same port provide TCP service, any incoming TCP connection requests over the port cannot be guaranteed to be handled by the correct socket — the behavior is non-deterministic. >From that article, it appears SO_REUSEADDR means something rather different in Windows than in Unix. Likewise, an "active" TCP port is a port that is currently in one of the following states: ESTABLISHED, FIN_WAIT, FIN_WAIT_2, or LAST_ACK. Ports without SO_EXCLUSIVEADDRUSE set may be reused as soon as the socket on which bind was previously called is closed. So here's how I interpret the situation: Windows Unix Meaning ------------------------------------------------------------------- default SO_REUSEADDR Can reuse a socket immediately after you close it, without waiting for the other end of the connection to close (or time out) SO_EXCLUSIVEADDR default Cannot reuse a socket until both ends of all connections have closed them (or timed out) SO_REUSEADDR not possible Unsafe! Of course what we want is the first case. -- Peter Samuelson | org-tld!p12n!peter | http://p12n.org/