Chromium Code Reviews| Index: net/udp/udp_socket_win.cc |
| diff --git a/net/udp/udp_socket_win.cc b/net/udp/udp_socket_win.cc |
| index 7be97e8695d5510cc83a9c6f6aefe775352583c2..552ce5b7ce09eb2fd1a4ef71867a77aa9ae35763 100644 |
| --- a/net/udp/udp_socket_win.cc |
| +++ b/net/udp/udp_socket_win.cc |
| @@ -255,6 +255,7 @@ UDPSocketWin::UDPSocketWin(DatagramSocket::BindType bind_type, |
| const net::NetLog::Source& source) |
| : socket_(INVALID_SOCKET), |
| addr_family_(0), |
| + is_connected_(false), |
| socket_options_(SOCKET_OPTION_MULTICAST_LOOP), |
| multicast_interface_(0), |
| multicast_time_to_live_(1), |
| @@ -276,10 +277,16 @@ UDPSocketWin::~UDPSocketWin() { |
| net_log_.EndEvent(NetLog::TYPE_SOCKET_ALIVE); |
| } |
| +int UDPSocketWin::Open(AddressFamily address_family) { |
| + DCHECK(CalledOnValidThread()); |
| + DCHECK(socket_ == INVALID_SOCKET); |
|
rvargas (doing something else)
2014/12/02 23:28:10
DCHECK_EQ
hidehiko
2014/12/03 17:33:27
Done.
|
| + return CreateSocket(ConvertAddressFamily(address_family)); |
| +} |
| + |
| void UDPSocketWin::Close() { |
| DCHECK(CalledOnValidThread()); |
| - if (!is_connected()) |
| + if (socket_ == INVALID_SOCKET) |
| return; |
| if (qos_handle_) { |
| @@ -297,6 +304,7 @@ void UDPSocketWin::Close() { |
| base::TimeTicks::Now() - start_time); |
| socket_ = INVALID_SOCKET; |
| addr_family_ = 0; |
| + is_connected_ = false; |
| core_->Detach(); |
| core_ = NULL; |
| @@ -410,25 +418,21 @@ int UDPSocketWin::Connect(const IPEndPoint& address) { |
| net_log_.BeginEvent(NetLog::TYPE_UDP_CONNECT, |
|
rvargas (doing something else)
2014/12/02 23:28:09
DCHECK_NE(socket_, invalid)
hidehiko
2014/12/03 17:33:28
Done.
|
| CreateNetLogUDPConnectCallback(&address)); |
| int rv = InternalConnect(address); |
| - if (rv != OK) |
| - Close(); |
| net_log_.EndEventWithNetErrorCode(NetLog::TYPE_UDP_CONNECT, rv); |
| + is_connected_ = (rv == OK); |
| return rv; |
| } |
| int UDPSocketWin::InternalConnect(const IPEndPoint& address) { |
| DCHECK(!is_connected()); |
| DCHECK(!remote_address_.get()); |
| - int addr_family = address.GetSockAddrFamily(); |
| - int rv = CreateSocket(addr_family); |
| - if (rv < 0) |
| - return rv; |
| + int rv = 0; |
| if (bind_type_ == DatagramSocket::RANDOM_BIND) { |
| // Construct IPAddressNumber of appropriate size (IPv4 or IPv6) of 0s, |
| // representing INADDR_ANY or in6addr_any. |
| - size_t addr_size = |
| - addr_family == AF_INET ? kIPv4AddressSize : kIPv6AddressSize; |
| + size_t addr_size = (address.GetSockAddrFamily() == AF_INET) ? |
| + kIPv4AddressSize : kIPv6AddressSize; |
| IPAddressNumber addr_any(addr_size); |
| rv = RandomBind(addr_any); |
| } |
| @@ -436,7 +440,6 @@ int UDPSocketWin::InternalConnect(const IPEndPoint& address) { |
| if (rv < 0) { |
| UMA_HISTOGRAM_SPARSE_SLOWLY("Net.UdpSocketRandomBindErrorCode", -rv); |
| - Close(); |
| return rv; |
| } |
| @@ -447,9 +450,7 @@ int UDPSocketWin::InternalConnect(const IPEndPoint& address) { |
| rv = connect(socket_, storage.addr, storage.addr_len); |
| if (rv < 0) { |
| // Close() may change the last error. Map it beforehand. |
|
rvargas (doing something else)
2014/12/02 23:28:09
The comment is stale
hidehiko
2014/12/03 17:33:28
Done.
|
| - int result = MapSystemError(WSAGetLastError()); |
| - Close(); |
| - return result; |
| + return MapSystemError(WSAGetLastError()); |
| } |
| remote_address_.reset(new IPEndPoint(address)); |
| @@ -458,20 +459,17 @@ int UDPSocketWin::InternalConnect(const IPEndPoint& address) { |
| int UDPSocketWin::Bind(const IPEndPoint& address) { |
|
rvargas (doing something else)
2014/12/02 23:28:09
DCHECK_NE(socket_, invalid)
hidehiko
2014/12/03 17:33:28
Done.
|
| DCHECK(!is_connected()); |
| - int rv = CreateSocket(address.GetSockAddrFamily()); |
| + |
| + int rv = SetSocketOptions(); |
| if (rv < 0) |
| return rv; |
| - rv = SetSocketOptions(); |
| - if (rv < 0) { |
| - Close(); |
| - return rv; |
| - } |
| + |
| rv = DoBind(address); |
| - if (rv < 0) { |
| - Close(); |
| + if (rv < 0) |
| return rv; |
| - } |
| + |
| local_address_.reset(); |
| + is_connected_ = true; |
| return rv; |
| } |
| @@ -534,11 +532,13 @@ void UDPSocketWin::AllowAddressReuse() { |
| socket_options_ |= SOCKET_OPTION_REUSE_ADDRESS; |
| } |
| -void UDPSocketWin::AllowBroadcast() { |
| +int UDPSocketWin::SetBroadcast(bool broadcast) { |
| DCHECK(CalledOnValidThread()); |
| - DCHECK(!is_connected()); |
| - socket_options_ |= SOCKET_OPTION_BROADCAST; |
| + BOOL value = broadcast ? TRUE : FALSE; |
| + int rv = setsockopt(socket_, SOL_SOCKET, SO_BROADCAST, |
| + reinterpret_cast<const char*>(&value), sizeof(value)); |
| + return rv == 0 ? OK : MapSystemError(WSAGetLastError()); |
| } |
| void UDPSocketWin::DoReadCallback(int rv) { |
| @@ -719,21 +719,14 @@ int UDPSocketWin::InternalSendTo(IOBuffer* buf, int buf_len, |
| } |
| int UDPSocketWin::SetSocketOptions() { |
| - BOOL true_value = 1; |
| if (socket_options_ & SOCKET_OPTION_REUSE_ADDRESS) { |
|
rvargas (doing something else)
2014/12/02 23:28:09
For consistency it looks like we should move this
hidehiko
2014/12/03 17:33:28
Done.
|
| + BOOL true_value = TRUE; |
| int rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, |
| reinterpret_cast<const char*>(&true_value), |
| sizeof(true_value)); |
| if (rv < 0) |
| return MapSystemError(WSAGetLastError()); |
| } |
| - if (socket_options_ & SOCKET_OPTION_BROADCAST) { |
| - int rv = setsockopt(socket_, SOL_SOCKET, SO_BROADCAST, |
| - reinterpret_cast<const char*>(&true_value), |
| - sizeof(true_value)); |
| - if (rv < 0) |
| - return MapSystemError(WSAGetLastError()); |
| - } |
| if (!(socket_options_ & SOCKET_OPTION_MULTICAST_LOOP)) { |
| DWORD loop = 0; |
| int protocol_level = |