Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(997)

Unified Diff: net/socket/tcp_client_socket.h

Issue 23881002: Windows only: Move client socket functionality from TCPClientSocket into TCPSocket. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/socket/tcp_client_socket.h
diff --git a/net/socket/tcp_client_socket.h b/net/socket/tcp_client_socket.h
index 8a2c0cd73f06f944ae5aa7f5ba4520542a5b9b72..841bc81b7f31cb67a6eeee2c8f6ac2e1668b7bff 100644
--- a/net/socket/tcp_client_socket.h
+++ b/net/socket/tcp_client_socket.h
@@ -8,21 +8,27 @@
#include "build/build_config.h"
#include "net/base/net_export.h"
-#if defined(OS_WIN)
-#include "net/socket/tcp_client_socket_win.h"
-#elif defined(OS_POSIX)
+// TODO(yzshen): Switch OS_POSIX to use the same platform-independent
+// TCPClientSocket.
+#if defined(OS_POSIX)
+
#include "net/socket/tcp_client_socket_libevent.h"
-#endif
-namespace net {
+#elif defined(OS_WIN)
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/memory/scoped_ptr.h"
+#include "net/base/address_list.h"
+#include "net/base/completion_callback.h"
+#include "net/base/net_log.h"
+#include "net/socket/stream_socket.h"
+#include "net/socket/tcp_socket.h"
-// A client socket that uses TCP as the transport layer.
-#if defined(OS_WIN)
-typedef TCPClientSocketWin TCPClientSocket;
-#elif defined(OS_POSIX)
-typedef TCPClientSocketLibevent TCPClientSocket;
#endif
+namespace net {
+
// Enable/disable experimental TCP FastOpen option.
// Not thread safe. Must be called during initialization/startup only.
NET_EXPORT void SetTCPFastOpenEnabled(bool value);
@@ -30,6 +36,111 @@ NET_EXPORT void SetTCPFastOpenEnabled(bool value);
// Check if the TCP FastOpen option is enabled.
bool IsTCPFastOpenEnabled();
+// A client socket that uses TCP as the transport layer.
+#if defined(OS_POSIX)
+typedef TCPClientSocketLibevent TCPClientSocket;
+#elif defined(OS_WIN)
+
+class NET_EXPORT TCPClientSocket : public StreamSocket {
+ 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.
+ TCPClientSocket(const AddressList& addresses,
+ net::NetLog* net_log,
+ const net::NetLog::Source& source);
+
+ // Adopts the given, connected socket and then acts as if Connect() had been
+ // called. This function is used by TCPServerSocket and for testing.
+ TCPClientSocket(scoped_ptr<TCPSocket> connected_socket,
+ const IPEndPoint& peer_address);
+
+ virtual ~TCPClientSocket();
+
+ // Binds the socket to a local IP address and port.
+ int Bind(const IPEndPoint& address);
+
+ // StreamSocket implementation.
+ virtual int Connect(const CompletionCallback& callback) OVERRIDE;
+ virtual void Disconnect() OVERRIDE;
+ virtual bool IsConnected() const OVERRIDE;
+ virtual bool IsConnectedAndIdle() const OVERRIDE;
+ virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
+ virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE;
+ virtual const BoundNetLog& NetLog() const OVERRIDE;
+ virtual void SetSubresourceSpeculation() OVERRIDE;
+ virtual void SetOmniboxSpeculation() OVERRIDE;
+ virtual bool WasEverUsed() const OVERRIDE;
+ virtual bool UsingTCPFastOpen() const OVERRIDE;
+ virtual bool WasNpnNegotiated() const OVERRIDE;
+ virtual NextProto GetNegotiatedProtocol() const OVERRIDE;
+ virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE;
+
+ // Socket implementation.
+ // Multiple outstanding requests are not supported.
+ // Full duplex mode (reading and writing at the same time) is supported.
+ virtual int Read(IOBuffer* buf, int buf_len,
+ const CompletionCallback& callback) OVERRIDE;
+ virtual int Write(IOBuffer* buf, int buf_len,
+ const CompletionCallback& callback) OVERRIDE;
+ virtual bool SetReceiveBufferSize(int32 size) OVERRIDE;
+ virtual bool SetSendBufferSize(int32 size) OVERRIDE;
+
+ virtual bool SetKeepAlive(bool enable, int delay);
+ virtual bool SetNoDelay(bool no_delay);
+
+ private:
+ // State machine for connecting the socket.
+ enum ConnectState {
+ CONNECT_STATE_CONNECT,
+ CONNECT_STATE_CONNECT_COMPLETE,
+ CONNECT_STATE_NONE,
+ };
+
+ // State machine used by Connect().
+ int DoConnectLoop(int result);
+ int DoConnect();
+ int DoConnectComplete(int result);
+
+ // Helper used by Disconnect(), which disconnects minus resetting
+ // current_address_index_ and bind_address_.
+ void DoDisconnect();
+
+ void DidCompleteConnect(int result);
+ void DidCompleteReadWrite(const CompletionCallback& callback, int result);
+
+ int OpenSocket(AddressFamily family);
+
+ scoped_ptr<TCPSocket> socket_;
+
+ // Local IP address and port we are bound to. Set to NULL if Bind()
+ // wasn't called (in that case OS chooses address/port).
+ scoped_ptr<IPEndPoint> bind_address_;
+
+ // The list of addresses we should try in order to establish a connection.
+ AddressList addresses_;
+
+ // Where we are in above list. Set to -1 if uninitialized.
+ int current_address_index_;
+
+ // External callback; called when connect is complete.
+ CompletionCallback connect_callback_;
+
+ // The next state for the Connect() state machine.
+ ConnectState next_connect_state_;
+
+ // This socket was previously disconnected and has not been re-connected.
+ bool previously_disconnected_;
+
+ // Record of connectivity and transmissions, for use in speculative connection
+ // histograms.
+ UseHistory use_history_;
+
+ DISALLOW_COPY_AND_ASSIGN(TCPClientSocket);
+};
+
+#endif
+
} // namespace net
#endif // NET_SOCKET_TCP_CLIENT_SOCKET_H_
« no previous file with comments | « net/net.gyp ('k') | net/socket/tcp_client_socket.cc » ('j') | net/socket/tcp_socket_win.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698