diff options
Diffstat (limited to 'net/socket/tcp_server_socket_win.cc')
-rw-r--r-- | net/socket/tcp_server_socket_win.cc | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/net/socket/tcp_server_socket_win.cc b/net/socket/tcp_server_socket_win.cc index eb15ffb..817e73a 100644 --- a/net/socket/tcp_server_socket_win.cc +++ b/net/socket/tcp_server_socket_win.cc @@ -21,6 +21,7 @@ TCPServerSocketWin::TCPServerSocketWin(net::NetLog* net_log, : socket_(INVALID_SOCKET), socket_event_(WSA_INVALID_EVENT), accept_socket_(NULL), + reuse_address_(false), net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) { net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE, source.ToEventParametersCallback()); @@ -32,6 +33,14 @@ TCPServerSocketWin::~TCPServerSocketWin() { net_log_.EndEvent(NetLog::TYPE_SOCKET_ALIVE); } +void TCPServerSocketWin::AllowAddressReuse() { + DCHECK(CalledOnValidThread()); + DCHECK_EQ(socket_, INVALID_SOCKET); + DCHECK_EQ(socket_event_, WSA_INVALID_EVENT); + + reuse_address_ = true; +} + int TCPServerSocketWin::Listen(const IPEndPoint& address, int backlog) { DCHECK(CalledOnValidThread()); DCHECK_GT(backlog, 0); @@ -56,11 +65,15 @@ int TCPServerSocketWin::Listen(const IPEndPoint& address, int backlog) { return result; } + int result = SetSocketOptions(); + if (result != OK) + return result; + SockaddrStorage storage; if (!address.ToSockAddr(storage.addr, &storage.addr_len)) return ERR_INVALID_ARGUMENT; - int result = bind(socket_, storage.addr, storage.addr_len); + result = bind(socket_, storage.addr, storage.addr_len); if (result < 0) { PLOG(ERROR) << "bind() returned an error"; result = MapSystemError(WSAGetLastError()); @@ -115,6 +128,18 @@ int TCPServerSocketWin::Accept( return result; } +int TCPServerSocketWin::SetSocketOptions() { + BOOL true_value = 1; + if (reuse_address_) { + int rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, + reinterpret_cast<const char*>(&true_value), + sizeof(true_value)); + if (rv < 0) + return MapSystemError(errno); + } + return OK; +} + int TCPServerSocketWin::AcceptInternal(scoped_ptr<StreamSocket>* socket) { SockaddrStorage storage; int new_socket = accept(socket_, storage.addr, &storage.addr_len); |