Hi,
I've been working on IPv6 support, and one of the strangest things
I find is BIO_get_accept_socket().
If bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED, and bind() fails
with EADDRINUSE it creates a new socket and tries to connect
to the port it tried to bind() to, and if that fails tries to
bind to it again but now with setting SO_REUSEADDR.
Does anybody have an idea why it's trying to do that, and why we
shouldn't just do SO_REUSEADDR the first time? Was there some
OS that maybe did strange things when trying to use SO_REUSEADDR
and it was already in use?
The documentation also says:
| BIO_set_bind_mode() and BIO_get_bind_mode() set and retrieve
| the current bind mode. If BIO_BIND_NORMAL (the default) is set
| then another socket cannot be bound to the same port. If
| BIO_BIND_REUSEADDR is set then other sockets can bind to the
| same port. If BIO_BIND_REUSEADDR_IF_UNUSED is set then and
| attempt is first made to use BIO_BIN_NORMAL, if this fails
| and the port is not in use then a second attempt is made
| using BIO_BIND_REUSEADDR.
The documentation is at least confusing, since it's about the
address and port combination and not just the port. The main
reason for using SO_REUSEADDR is that you can bind to an
address / port combination that is in TIME_WAIT state, and it's
recommended for server applications to always set this, and it's
what I ended up doing in my new function. There are also some
other cases you might want to use SO_REUSEADDR, and I suggest you
read Stevens for that.
In no case should it be possible to bind to the same TCP address /
port from different applications, SO_REUSEADDR does not allow you
to do that.
But then I found some MSDN documentation that says that Windows
allows others to hijack your socket when you've set SO_REUSEADDR
and the results are non-deterministic. They also created an
SO_EXCLUSIVEADDRUSE and I'm getting confused what it really does,
but they say that server applications should set it.
Anyway, is that whole logic with the connect() needed, or can I
just always use SO_REUSEADDR (on non-windows hosts)?
Kurt
______________________________________________________________________
OpenSSL Project
http://www.openssl.orgDevelopment Mailing List
[hidden email]
Automated List Manager
[hidden email]