[omniORB] Port allocation problem on windows (incl. patch)
Felix Nawothnig
fn at drdannenberg.de
Wed Apr 14 20:28:02 BST 2010
> Windows has a fundamentally different understanding of the socket option
> SO_REUSEADDR than posix systems [...]
Ran into this too a couple of weeks ago.
> I didn't find out whether SO_REUSEADDR and SO_EXCLUSIVEADDRUSE (which is
> Microsofts' way of fixing the described issue) can be used together but
> using only SO_REUSEADDR on windows does more harm than good.
According to the pages I read on MSDN they can't.
>From what I've understood from MSDN the situation is like this
(Disclaimer: I have not tested all of this - this is mostly based on texts
spread through dozens of MSDN pages):
Micrsoft's SO_REUSEADDR implementation is purely insane and should never
be used under any circumstances (for obvious reasons).
To fix SO_REUSEADDR they invented SO_EXCLUSIVEADDRUSE which does nothing
but prevent _other_ applications from hijacking ports using SO_REUSEADDR -
but it does _not_ solve the original problem for which SO_REUSEADDR is a
solution on unix (the impossibility to rebind to sockets in TIME_WAIT
state).
Also note that before Vista SO_EXCLUSIVEADDRUSE required administrative
rights, so it's not really usable when targeting XP or earlier systems.
So - as I understand this: If you want to safely listen to a TCP socket on
Windows you can not use SO_REUSEADDR, have to use SO_EXCLUSIVEADDRUSE, be
prepared that you might need administrative rights and live with the fact
that you have to wait for the TIME_WAIT to time-out.
I'd be curious if anyone can give me a hint on what the _fuck_ the
developers might have been smoking when they designed this.
Personally I simply use SO_REUSEADDR, create a named mutex to ensure my
application doesn't bind twice to the same port and add a disclaimer that
everything might break down horribly if someone runs another application
besides mine on that machine - Windows isn't really for multitasking you
know.
As an alternative one could call netstat to see if there is another
application using that port right now. Race-con? What race-con?
Note that there is some text on
http://msdn.microsoft.com/en-us/library/ms740621%28VS.85%29.aspx talking
about SO_LINGER which _might_ be a solution to solve the TIME_WAIT
issue... maybe someone knows more about this.
Cheers,
Felix
P.S.: Sorry for this flamebait - I just wasted way too much time on this
issue until I finally gave up... I'd very much like to be proven wrong...
More information about the omniORB-list
mailing list