[Python-Dev] 2.4 asyncore headache
Nick Coghlan
ncoghlan at iinet.net.au
Sat Aug 14 01:30:47 CEST 2004
Tim Peters wrote:
> [Tim]
>
>>>Now somebody, for some reason, added this to 2.4's asyncore.py:
>>> if sys.platform == 'win32':
>>> reuse_constant = socket.SO_EXCLUSIVEADDRUSE
>
>
> [Andrew]
>
>>I'll back out this change.
>
>
> But only if that's the right thing to do <0.9 wink>. I gave up
> reading the Windows SO_EXCLUSIVEADDRUSE docs after it got to the "This
> situation can be quite complicated; even though the socket has been
> closed, the underlying transport may not terminate its connection ..."
> part. But by that point, it sure didn't seem like SO_EXCLUSIVEADDRUSE
> was a plausible Windowsy way to spell the Unixy SO_REUSEADDR ...
Is test_socketserver currently passing for you?
A couple of days ago I ran the test suite with -unetwork, and that test
failed, but I haven't got around to looking into it yet. Could this be
related?
[rambling discussion of what I found out about this so far follows]
Anyway, after some hunting, the difference between Windows and Unix
SO_REUSEADDR, is that on Unix, this only allows local address reuse when
the existing socket is in a TIME_WAIT state. On Windows, it allows local
address reuse _anytime_.
See http://hea-www.harvard.edu/~fine/Tech/addrinuse.html. Look for the
phrase 'security stigma', then read the bit starting with 'On some
operating systems. . .'
The issue is that if we *don't* set SO_REUSEADDR on Windows, then you
get into problems with getting EADDRINUSE when you shutdown and restart
a TCP/IP server on the same local address (generally if the socket has
gone into TIME_WAIT while shutting down).
Looking at MSDN, SO_EXCLUSIVEADDRUSE is a way to say 'make my socket
behave like a UNIX socket without SO_REUSEADDR specified'. That is, with
no options specified, a Windows socket is vulnerable to having another
process come along, specify SO_REUSEADDR for their socket options, and
succeed in reusing the same local port.
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/using_so_exclusiveaddruse.asp)
What I can't find is a way to get Unix-like SO_REUSEADDR behaviour on
Windows.
Cheers,
Nick.
--
Nick Coghlan | Eugene, Oregon
Email: ncoghlan at email.com | USA
More information about the Python-Dev
mailing list