| 111 | } |
| 112 | |
| 113 | void Socket::bind(HostAddressWithPort const& addressWithPort) { |
| 114 | WriteLocker locker(m_mutex); |
| 115 | checkOpen("Socket::bind"); |
| 116 | |
| 117 | struct sockaddr_storage sockAddr; |
| 118 | socklen_t sockAddrLen; |
| 119 | |
| 120 | if (addressWithPort.address().mode() != m_networkMode) |
| 121 | throw NetworkException("Bind address does not match socket mode"); |
| 122 | |
| 123 | // Ensure quick restarts don't prevent us binding |
| 124 | int set = 1; |
| 125 | m_impl->setSockOpt(SOL_SOCKET, SO_REUSEADDR, (void*)&set, sizeof(int)); |
| 126 | |
| 127 | m_localAddress = addressWithPort; |
| 128 | setNativeFromAddress(m_localAddress, &sockAddr, &sockAddrLen); |
| 129 | if (::bind(m_impl->socketDesc, (struct sockaddr*)&sockAddr, sockAddrLen) < 0) |
| 130 | throw NetworkException(strf("Cannot bind socket to {}: {}", m_localAddress, netErrorString())); |
| 131 | |
| 132 | m_socketMode = SocketMode::Bound; |
| 133 | |
| 134 | Logger::debug("bind {} ({})", addressWithPort, m_impl->socketDesc); |
| 135 | } |
| 136 | |
| 137 | void Socket::listen(int backlog) { |
| 138 | WriteLocker locker(m_mutex); |
no test coverage detected