summaryrefslogtreecommitdiffstats
path: root/net/socket/tcp_client_socket_libevent.cc
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-27 19:39:39 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-27 19:39:39 +0000
commiteddf10e99b05dc800637c39c4f7e89faba3e616a (patch)
tree90b3179dc20234af95ace693dec93ba62e117c36 /net/socket/tcp_client_socket_libevent.cc
parentf443d9e856f6b7f714cf719bd8596c00af619308 (diff)
downloadchromium_src-eddf10e99b05dc800637c39c4f7e89faba3e616a.zip
chromium_src-eddf10e99b05dc800637c39c4f7e89faba3e616a.tar.gz
chromium_src-eddf10e99b05dc800637c39c4f7e89faba3e616a.tar.bz2
Revert 87066 - Bind() methods for TCP sockets
BUG=80245 TEST=None Review URL: http://codereview.chromium.org/7004055 TBR=sergeyu@chromium.org Review URL: http://codereview.chromium.org/7087004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87070 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/tcp_client_socket_libevent.cc')
-rw-r--r--net/socket/tcp_client_socket_libevent.cc128
1 files changed, 34 insertions, 94 deletions
diff --git a/net/socket/tcp_client_socket_libevent.cc b/net/socket/tcp_client_socket_libevent.cc
index 5eb1716..6e0cb1c 100644
--- a/net/socket/tcp_client_socket_libevent.cc
+++ b/net/socket/tcp_client_socket_libevent.cc
@@ -70,36 +70,6 @@ void SetTCPKeepAlive(int fd) {
#endif
}
-// Sets socket parameters. Returns the OS error code (or 0 on
-// success).
-int SetupSocket(int socket) {
- if (SetNonBlocking(socket))
- return errno;
-
- // This mirrors the behaviour on Windows. See the comment in
- // tcp_client_socket_win.cc after searching for "NODELAY".
- DisableNagle(socket); // If DisableNagle fails, we don't care.
- SetTCPKeepAlive(socket);
-
- return 0;
-}
-
-// Creates a new socket and sets default parameters for it. Returns
-// the OS error code (or 0 on success).
-int CreateSocket(int family, int* socket) {
- *socket = ::socket(family, SOCK_STREAM, IPPROTO_TCP);
- if (*socket == kInvalidSocket)
- return errno;
- int error = SetupSocket(*socket);
- if (error) {
- if (HANDLE_EINTR(close(*socket)) < 0)
- PLOG(ERROR) << "close";
- *socket = kInvalidSocket;
- return error;
- }
- return 0;
-}
-
int MapConnectError(int os_error) {
switch (os_error) {
case EACCES:
@@ -130,7 +100,6 @@ TCPClientSocketLibevent::TCPClientSocketLibevent(
net::NetLog* net_log,
const net::NetLog::Source& source)
: socket_(kInvalidSocket),
- bound_socket_(kInvalidSocket),
addresses_(addresses),
current_ai_(NULL),
read_watcher_(this),
@@ -157,53 +126,16 @@ TCPClientSocketLibevent::~TCPClientSocketLibevent() {
net_log_.EndEvent(NetLog::TYPE_SOCKET_ALIVE, NULL);
}
-int TCPClientSocketLibevent::AdoptSocket(int socket) {
+void TCPClientSocketLibevent::AdoptSocket(int socket) {
DCHECK_EQ(socket_, kInvalidSocket);
-
- int error = SetupSocket(socket);
- if (error)
- return MapSystemError(error);
-
socket_ = socket;
-
- // This is to make GetPeerAddress() work. It's up to the caller ensure
- // that |address_| contains a reasonable address for this
- // socket. (i.e. at least match IPv4 vs IPv6!).
+ int error = SetupSocket();
+ DCHECK_EQ(0, error);
+ // This is to make GetPeerAddress work. It's up to the test that is calling
+ // this function to ensure that address_ contains a reasonable address for
+ // this socket. (i.e. at least match IPv4 vs IPv6!).
current_ai_ = addresses_.head();
use_history_.set_was_ever_connected();
-
- return OK;
-}
-
-int TCPClientSocketLibevent::Bind(const IPEndPoint& address) {
- if (current_ai_ != NULL || bind_address_.get()) {
- // Cannot bind the socket if we are already bound connected or
- // connecting.
- return ERR_UNEXPECTED;
- }
-
- sockaddr_storage addr_storage;
- sockaddr* addr = reinterpret_cast<struct sockaddr*>(&addr_storage);
- size_t addr_len;
- if (!address.ToSockAddr(addr, &addr_len))
- return ERR_INVALID_ARGUMENT;
-
- // Create |bound_socket_| and try to bound it to |address|.
- int error = CreateSocket(address.GetFamily(), &bound_socket_);
- if (error)
- return MapSystemError(error);
-
- if (HANDLE_EINTR(bind(bound_socket_, addr, addr_len))) {
- error = errno;
- if (HANDLE_EINTR(close(bound_socket_)) < 0)
- PLOG(ERROR) << "close";
- bound_socket_ = kInvalidSocket;
- return MapSystemError(error);
- }
-
- bind_address_.reset(new IPEndPoint(address));
-
- return 0;
}
int TCPClientSocketLibevent::Connect(CompletionCallback* callback) {
@@ -280,26 +212,10 @@ int TCPClientSocketLibevent::DoConnect() {
next_connect_state_ = CONNECT_STATE_CONNECT_COMPLETE;
- if (bound_socket_ != kInvalidSocket) {
- DCHECK(bind_address_.get());
- socket_ = bound_socket_;
- bound_socket_ = kInvalidSocket;
- } else {
- // Create a non-blocking socket.
- connect_os_error_ = CreateSocket(current_ai_->ai_family, &socket_);
- if (connect_os_error_)
- return MapSystemError(connect_os_error_);
-
- if (bind_address_.get()) {
- sockaddr_storage addr_storage;
- sockaddr* addr = reinterpret_cast<struct sockaddr*>(&addr_storage);
- size_t addr_len;
- if (!bind_address_->ToSockAddr(addr, &addr_len))
- return ERR_INVALID_ARGUMENT;
- if (HANDLE_EINTR(bind(socket_, addr, addr_len)))
- return MapSystemError(errno);
- }
- }
+ // Create a non-blocking socket.
+ connect_os_error_ = CreateSocket(current_ai_);
+ if (connect_os_error_)
+ return MapSystemError(connect_os_error_);
// Connect the socket.
if (!use_tcp_fastopen_) {
@@ -544,6 +460,30 @@ bool TCPClientSocketLibevent::SetSendBufferSize(int32 size) {
return rv == 0;
}
+
+int TCPClientSocketLibevent::CreateSocket(const addrinfo* ai) {
+ socket_ = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (socket_ == kInvalidSocket)
+ return errno;
+ return SetupSocket();
+}
+
+int TCPClientSocketLibevent::SetupSocket() {
+ if (SetNonBlocking(socket_)) {
+ const int err = errno;
+ close(socket_);
+ socket_ = kInvalidSocket;
+ return err;
+ }
+
+ // This mirrors the behaviour on Windows. See the comment in
+ // tcp_client_socket_win.cc after searching for "NODELAY".
+ DisableNagle(socket_); // If DisableNagle fails, we don't care.
+ SetTCPKeepAlive(socket_);
+
+ return 0;
+}
+
void TCPClientSocketLibevent::LogConnectCompletion(int net_error) {
if (net_error == OK)
UpdateConnectionTypeHistograms(CONNECTION_ANY);