diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-17 23:39:37 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-17 23:39:37 +0000 |
commit | 340ba394b3b34db9c805418c5e54f37e3b264bd2 (patch) | |
tree | 326844a05569dcfe82625ae63d988e1da630074e /net/base/tcp_client_socket.h | |
parent | f4dbdd6824257dcb211c47d4a950cc955af60953 (diff) | |
download | chromium_src-340ba394b3b34db9c805418c5e54f37e3b264bd2.zip chromium_src-340ba394b3b34db9c805418c5e54f37e3b264bd2.tar.gz chromium_src-340ba394b3b34db9c805418c5e54f37e3b264bd2.tar.bz2 |
Implement full duplex mode for windows tcp sockets.
Move tcp_client_socket.h stuff to tcp_client_socket_libevent.h and
tcp_client_socket_win.h.
Add tests.
Review URL: http://codereview.chromium.org/75030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13983 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/tcp_client_socket.h')
-rw-r--r-- | net/base/tcp_client_socket.h | 122 |
1 files changed, 5 insertions, 117 deletions
diff --git a/net/base/tcp_client_socket.h b/net/base/tcp_client_socket.h index 729bbbc..820e586 100644 --- a/net/base/tcp_client_socket.h +++ b/net/base/tcp_client_socket.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2006-2009 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,132 +8,20 @@ #include "build/build_config.h" #if defined(OS_WIN) -#include <ws2tcpip.h> -#include "base/object_watcher.h" +#include "net/base/tcp_client_socket_win.h" #elif defined(OS_POSIX) -struct event; // From libevent -#include <sys/socket.h> // for struct sockaddr -#define SOCKET int -#include "base/message_loop.h" +#include "net/base/tcp_client_socket_libevent.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) - 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(); +typedef TCPClientSocketWin TCPClientSocket; #elif defined(OS_POSIX) - // 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(); +typedef TCPClientSocketLibevent TCPClientSocket; #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_ |