Index: net/base/tcp_client_socket.h |
=================================================================== |
--- net/base/tcp_client_socket.h (revision 3736) |
+++ net/base/tcp_client_socket.h (working copy) |
@@ -12,6 +12,7 @@ |
#include "base/object_watcher.h" |
#elif defined(OS_POSIX) |
struct event; // From libevent |
+#include <sys/socket.h> // for struct sockaddr |
#define SOCKET int |
#include "base/message_pump_libevent.h" |
#endif |
@@ -25,8 +26,10 @@ |
// A client socket that uses TCP as the transport layer. |
// |
-// NOTE: The implementation supports half duplex only. Read and Write calls |
-// must not be in progress at the same time. |
+// 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 |
@@ -49,11 +52,19 @@ |
virtual bool IsConnected() const; |
// Socket methods: |
- // Multiple outstanding requests are not supported. In particular, full |
- // duplex mode (reading and writing at the same time) is not supported. |
+ // 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_; |
@@ -63,6 +74,7 @@ |
// 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, |
@@ -71,7 +83,6 @@ |
}; |
WaitState wait_state_; |
-#if defined(OS_WIN) |
// base::ObjectWatcher::Delegate methods: |
virtual void OnObjectSignaled(HANDLE object); |
@@ -79,25 +90,40 @@ |
WSABUF buffer_; |
base::ObjectWatcher watcher_; |
+ |
+ void DidCompleteIO(); |
#elif defined(OS_POSIX) |
+ // Whether we're currently waiting for connect() to complete |
+ bool waiting_connect_; |
+ |
// 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 |
+ // 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 or write is complete. |
+ // 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(); |
- void DidCompleteIO(); |
}; |
} // namespace net |