Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Unified Diff: net/udp/udp_socket_win.cc

Issue 721273002: Remove timing limitation to set Broadcast, ReceiveBuffer, and SendBuffer options from UDPSocket. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« net/udp/udp_socket_win.h ('K') | « net/udp/udp_socket_win.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 =
« net/udp/udp_socket_win.h ('K') | « net/udp/udp_socket_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698