diff options
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..96589464 100644 --- a/net/base/tcp_client_socket.h +++ b/net/base/tcp_client_socket.h @@ -5,11 +5,21 @@ #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/scoped_ptr.h" #include "net/base/address_list.h" #include "net/base/client_socket.h" +#include "net/base/completion_callback.h" namespace net { @@ -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 |