`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.
#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);