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 = |