`SO_REUSEADDR` is useful on TCP server sockets to allow binding quickly
after restarting the process without waiting `TIME_WAIT` seconds, or
to allow some port reuse on BSD. It also allows reusing a port more
quickly for TCP client sockets.
For UDP sockets, however, Linux allows two sockets to be bound to the
same address and port, and will distribute all packets to the most
recent socket, which is very unexpected, to say the least.
(cherry picked from commit
b33f09f1989e938c503142a38c556df94254443a)
#endif
if (!IsAnyAddress(d_config.sourceAddr)) {
- SSetsockopt(fd, SOL_SOCKET, SO_REUSEADDR, 1);
#ifdef IP_BIND_ADDRESS_NO_PORT
if (d_config.ipBindAddrNoPort) {
SSetsockopt(fd, SOL_IP, IP_BIND_ADDRESS_NO_PORT, 1);
#endif
if (!IsAnyAddress(ds->d_config.sourceAddr)) {
- sock.setReuseAddr();
+ if (ds->doHealthcheckOverTCP()) {
+ sock.setReuseAddr();
+ }
#ifdef IP_BIND_ADDRESS_NO_PORT
if (ds->d_config.ipBindAddrNoPort) {
SSetsockopt(sock.getHandle(), SOL_IP, IP_BIND_ADDRESS_NO_PORT, 1);