15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SOCKET_TCP_CLIENT_SOCKET_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SOCKET_TCP_CLIENT_SOCKET_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/basictypes.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/compiler_specific.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/base/address_list.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/base/completion_callback.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/base/net_log.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/socket/stream_socket.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/socket/tcp_socket.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A client socket that uses TCP as the transport layer. 21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class NET_EXPORT TCPClientSocket : public StreamSocket { 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The IP address(es) and port number to connect to. The TCP socket will try 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // each IP address in the list until it succeeds in establishing a 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // connection. 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TCPClientSocket(const AddressList& addresses, 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::NetLog* net_log, 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const net::NetLog::Source& source); 29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Adopts the given, connected socket and then acts as if Connect() had been 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // called. This function is used by TCPServerSocket and for testing. 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TCPClientSocket(scoped_ptr<TCPSocket> connected_socket, 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const IPEndPoint& peer_address); 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~TCPClientSocket(); 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Binds the socket to a local IP address and port. 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int Bind(const IPEndPoint& address); 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // StreamSocket implementation. 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual int Connect(const CompletionCallback& callback) OVERRIDE; 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void Disconnect() OVERRIDE; 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool IsConnected() const OVERRIDE; 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool IsConnectedAndIdle() const OVERRIDE; 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE; 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE; 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual const BoundNetLog& NetLog() const OVERRIDE; 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetSubresourceSpeculation() OVERRIDE; 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetOmniboxSpeculation() OVERRIDE; 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool WasEverUsed() const OVERRIDE; 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool UsingTCPFastOpen() const OVERRIDE; 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool WasNpnNegotiated() const OVERRIDE; 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual NextProto GetNegotiatedProtocol() const OVERRIDE; 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE; 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Socket implementation. 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Multiple outstanding requests are not supported. 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Full duplex mode (reading and writing at the same time) is supported. 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual int Read(IOBuffer* buf, int buf_len, 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual int Write(IOBuffer* buf, int buf_len, 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool SetReceiveBufferSize(int32 size) OVERRIDE; 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool SetSendBufferSize(int32 size) OVERRIDE; 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool SetKeepAlive(bool enable, int delay); 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool SetNoDelay(bool no_delay); 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // State machine for connecting the socket. 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) enum ConnectState { 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CONNECT_STATE_CONNECT, 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CONNECT_STATE_CONNECT_COMPLETE, 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CONNECT_STATE_NONE, 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }; 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // State machine used by Connect(). 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int DoConnectLoop(int result); 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int DoConnect(); 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int DoConnectComplete(int result); 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Helper used by Disconnect(), which disconnects minus resetting 83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // current_address_index_ and bind_address_. 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void DoDisconnect(); 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void DidCompleteConnect(int result); 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void DidCompleteReadWrite(const CompletionCallback& callback, int result); 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int OpenSocket(AddressFamily family); 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<TCPSocket> socket_; 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Local IP address and port we are bound to. Set to NULL if Bind() 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // wasn't called (in that case OS chooses address/port). 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<IPEndPoint> bind_address_; 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The list of addresses we should try in order to establish a connection. 98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddressList addresses_; 99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Where we are in above list. Set to -1 if uninitialized. 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int current_address_index_; 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // External callback; called when connect is complete. 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CompletionCallback connect_callback_; 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The next state for the Connect() state machine. 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ConnectState next_connect_state_; 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This socket was previously disconnected and has not been re-connected. 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool previously_disconnected_; 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Record of connectivity and transmissions, for use in speculative connection 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // histograms. 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UseHistory use_history_; 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TCPClientSocket); 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_SOCKET_TCP_CLIENT_SOCKET_H_ 122