summaryrefslogtreecommitdiffstats
path: root/net/base/tcp_client_socket.h
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-17 23:59:33 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-17 23:59:33 +0000
commitb391fb3da5e5af2388b71076234d2982327ceb48 (patch)
treef7d75fbb0b7def6fc8ca48578e825490e25fcaa5 /net/base/tcp_client_socket.h
parent5f78651f721e01b6b064697e6a513d44eaef8c90 (diff)
downloadchromium_src-b391fb3da5e5af2388b71076234d2982327ceb48.zip
chromium_src-b391fb3da5e5af2388b71076234d2982327ceb48.tar.gz
chromium_src-b391fb3da5e5af2388b71076234d2982327ceb48.tar.bz2
Reverting 13983.
Review URL: http://codereview.chromium.org/79066 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13987 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/tcp_client_socket.h')
-rw-r--r--net/base/tcp_client_socket.h122
1 files changed, 117 insertions, 5 deletions
diff --git a/net/base/tcp_client_socket.h b/net/base/tcp_client_socket.h
index 820e586..729bbbc 100644
--- a/net/base/tcp_client_socket.h
+++ b/net/base/tcp_client_socket.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,20 +8,132 @@
#include "build/build_config.h"
#if defined(OS_WIN)
-#include "net/base/tcp_client_socket_win.h"
+#include <ws2tcpip.h>
+#include "base/object_watcher.h"
#elif defined(OS_POSIX)
-#include "net/base/tcp_client_socket_libevent.h"
+struct event; // From libevent
+#include <sys/socket.h> // for struct sockaddr
+#define SOCKET int
+#include "base/message_loop.h"
#endif
+#include "net/base/address_list.h"
+#include "net/base/client_socket.h"
+#include "net/base/completion_callback.h"
+
namespace net {
// A client socket that uses TCP as the transport layer.
+//
+// NOTE: The windows implementation supports half duplex only.
+// Read and Write calls must not be in progress at the same time.
+// The libevent implementation supports full duplex because that
+// made it slightly easier to implement ssl.
+class TCPClientSocket : public ClientSocket,
+#if defined(OS_WIN)
+ public base::ObjectWatcher::Delegate
+#elif defined(OS_POSIX)
+ public MessageLoopForIO::Watcher
+#endif
+{
+ public:
+ // The IP address(es) and port number to connect to. The TCP socket will try
+ // each IP address in the list until it succeeds in establishing a
+ // connection.
+ explicit TCPClientSocket(const AddressList& addresses);
+
+ ~TCPClientSocket();
+
+ // ClientSocket methods:
+ virtual int Connect(CompletionCallback* callback);
+ virtual void Disconnect();
+ virtual bool IsConnected() const;
+ virtual bool IsConnectedAndIdle() const;
+
+ // Socket methods:
+ // Multiple outstanding requests are not supported.
+ // Full duplex mode (reading and writing at the same time) is not supported
+ // on Windows (but is supported on Linux and Mac for ease of implementation
+ // of SSLClientSocket)
+ virtual int Read(char* buf, int buf_len, CompletionCallback* callback);
+ virtual int Write(const char* buf, int buf_len, CompletionCallback* callback);
+
+#if defined(OS_POSIX)
+ // Identical to posix system call of same name
+ // Needed by ssl_client_socket_nss
+ virtual int GetPeerName(struct sockaddr *name, socklen_t *namelen);
+#endif
+
+ private:
+ SOCKET socket_;
+
+ // The list of addresses we should try in order to establish a connection.
+ AddressList addresses_;
+
+ // Where we are in above list, or NULL if all addrinfos have been tried.
+ const struct addrinfo* current_ai_;
+
#if defined(OS_WIN)
-typedef TCPClientSocketWin TCPClientSocket;
+ enum WaitState {
+ NOT_WAITING,
+ WAITING_CONNECT,
+ WAITING_READ,
+ WAITING_WRITE
+ };
+ WaitState wait_state_;
+
+ // base::ObjectWatcher::Delegate methods:
+ virtual void OnObjectSignaled(HANDLE object);
+
+ // Waits for the (manual-reset) event object to become signaled and resets
+ // it. Called after a Winsock function succeeds synchronously
+ //
+ // Our testing shows that except in rare cases (when running inside QEMU),
+ // the event object is already signaled at this point, so we just call this
+ // method on the IO thread to avoid a context switch.
+ void WaitForAndResetEvent();
+
+ OVERLAPPED overlapped_;
+ WSABUF buffer_;
+
+ base::ObjectWatcher watcher_;
+
+ void DidCompleteIO();
#elif defined(OS_POSIX)
-typedef TCPClientSocketLibevent TCPClientSocket;
+ // Whether we're currently waiting for connect() to complete
+ bool waiting_connect_;
+
+ // The socket's libevent wrapper
+ MessageLoopForIO::FileDescriptorWatcher socket_watcher_;
+
+ // Called by MessagePumpLibevent when the socket is ready to do I/O
+ void OnFileCanReadWithoutBlocking(int fd);
+ void OnFileCanWriteWithoutBlocking(int fd);
+
+ // The buffer used by OnSocketReady to retry Read requests
+ char* buf_;
+ int buf_len_;
+
+ // The buffer used by OnSocketReady to retry Write requests
+ const char* write_buf_;
+ int write_buf_len_;
+
+ // External callback; called when write is complete.
+ CompletionCallback* write_callback_;
+
+ void DoWriteCallback(int rv);
+ void DidCompleteRead();
+ void DidCompleteWrite();
#endif
+ // External callback; called when read (and on Windows, write) is complete.
+ CompletionCallback* callback_;
+
+ int CreateSocket(const struct addrinfo* ai);
+ void DoCallback(int rv);
+ void DidCompleteConnect();
+};
+
} // namespace net
#endif // NET_BASE_TCP_CLIENT_SOCKET_H_