diff options
author | dkegel@google.com <dkegel@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-09-18 00:10:38 +0000 |
---|---|---|
committer | dkegel@google.com <dkegel@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-09-18 00:10:38 +0000 |
commit | dab8619b4848bb10dfe78a3f0c59d6e661ec9610 (patch) | |
tree | 187818b2b685f5545832b45bbd20d01b53aca6d5 /net/base/tcp_client_socket.h | |
parent | 0fe41aecdbfd97633bda1a892b2f3efb60f1d3ed (diff) | |
download | chromium_src-dab8619b4848bb10dfe78a3f0c59d6e661ec9610.zip chromium_src-dab8619b4848bb10dfe78a3f0c59d6e661ec9610.tar.gz chromium_src-dab8619b4848bb10dfe78a3f0c59d6e661ec9610.tar.bz2 |
Make tcp_client_socket_unittest pass on Linux.
Requires another changeset that puts libevent in third_party;
I'll upload that next.
This is not the final word; it makes too many syscalls
per read. But it's a start.
Review URL: http://codereview.chromium.org/3202
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2346 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/tcp_client_socket.h')
-rw-r--r-- | net/base/tcp_client_socket.h | 71 |
1 files changed, 53 insertions, 18 deletions
diff --git a/net/base/tcp_client_socket.h b/net/base/tcp_client_socket.h index 06a57fe..32cd59a 100644 --- a/net/base/tcp_client_socket.h +++ b/net/base/tcp_client_socket.h @@ -5,9 +5,19 @@ #ifndef NET_BASE_TCP_CLIENT_SOCKET_H_ #define NET_BASE_TCP_CLIENT_SOCKET_H_ -#include <ws2tcpip.h> +#include "build/build_config.h" +#if defined(OS_WIN) +#include <ws2tcpip.h> #include "base/object_watcher.h" +#elif defined(OS_POSIX) +struct event; // From libevent +#define SOCKET int +#include "base/message_pump_libevent.h" +#endif + +#include "base/completion_callback.h" +#include "base/scoped_ptr.h" #include "net/base/address_list.h" #include "net/base/client_socket.h" @@ -18,7 +28,12 @@ namespace net { // NOTE: The implementation supports half duplex only. Read and Write calls // must not be in progress at the same time. class TCPClientSocket : public ClientSocket, - public base::ObjectWatcher::Delegate { +#if defined(OS_WIN) + public base::ObjectWatcher::Delegate +#elif defined(OS_POSIX) + public base::MessagePumpLibevent::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 @@ -34,31 +49,23 @@ class TCPClientSocket : public ClientSocket, virtual bool IsConnected() const; // Socket methods: + // Try to transfer buf_len bytes to/from socket. + // If a result is available now, return it; else call back later with one. + // Do not call again until a result is returned! + // If any bytes were transferred, the result is the byte count. + // On error, result is a negative error code; see net/base/net_error_list.h + // TODO: what would a zero return value indicate? + // TODO: support multiple outstanding requests? virtual int Read(char* buf, int buf_len, CompletionCallback* callback); virtual int Write(const char* buf, int buf_len, CompletionCallback* callback); private: - int CreateSocket(const struct addrinfo* ai); - void DoCallback(int rv); - void DidCompleteConnect(); - void DidCompleteIO(); - - // base::ObjectWatcher::Delegate methods: - virtual void OnObjectSignaled(HANDLE object); - SOCKET socket_; - OVERLAPPED overlapped_; - WSABUF buffer_; - - base::ObjectWatcher watcher_; - - CompletionCallback* callback_; // The list of addresses we should try in order to establish a connection. AddressList addresses_; - // The addrinfo that we are attempting to use or NULL if all addrinfos have - // been tried. + // Where we are in above list, or NULL if all addrinfos have been tried. const struct addrinfo* current_ai_; enum WaitState { @@ -68,6 +75,34 @@ class TCPClientSocket : public ClientSocket, WAITING_WRITE }; WaitState wait_state_; + +#if defined(OS_WIN) + // base::ObjectWatcher::Delegate methods: + virtual void OnObjectSignaled(HANDLE object); + + OVERLAPPED overlapped_; + WSABUF buffer_; + + base::ObjectWatcher watcher_; +#elif defined(OS_POSIX) + // The socket's libevent wrapper + scoped_ptr<event> event_; + + // Called by MessagePumpLibevent when the socket is ready to do I/O + void OnSocketReady(short flags); + + // The buffer used by OnSocketReady to retry Read and Write requests + char* buf_; + int buf_len_; +#endif + + // External callback; called when read or write is complete. + CompletionCallback* callback_; + + int CreateSocket(const struct addrinfo* ai); + void DoCallback(int rv); + void DidCompleteConnect(); + void DidCompleteIO(); }; } // namespace net |