| // Copyright (c) 2006- Facebook | 
 | // Distributed under the Thrift Software License | 
 | // | 
 | // See accompanying file LICENSE or visit the Thrift site at: | 
 | // http://developers.facebook.com/thrift/ | 
 |  | 
 | #ifndef _THRIFT_TRANSPORT_TSOCKET_H_ | 
 | #define _THRIFT_TRANSPORT_TSOCKET_H_ 1 | 
 |  | 
 | #include <string> | 
 | #include <sys/time.h> | 
 |  | 
 | #include "TTransport.h" | 
 | #include "TServerSocket.h" | 
 |  | 
 | namespace apache { namespace thrift { namespace transport { | 
 |  | 
 | /** | 
 |  * TCP Socket implementation of the TTransport interface. | 
 |  * | 
 |  * @author Mark Slee <mcslee@facebook.com> | 
 |  * @author Aditya Agarwal <aditya@facebook.com> | 
 |  */ | 
 | class TSocket : public TTransport { | 
 |   /** | 
 |    * We allow the TServerSocket acceptImpl() method to access the private | 
 |    * members of a socket so that it can access the TSocket(int socket) | 
 |    * constructor which creates a socket object from the raw UNIX socket | 
 |    * handle. | 
 |    */ | 
 |   friend class TServerSocket; | 
 |  | 
 |  public: | 
 |   /** | 
 |    * Constructs a new socket. Note that this does NOT actually connect the | 
 |    * socket. | 
 |    * | 
 |    */ | 
 |   TSocket(); | 
 |  | 
 |   /** | 
 |    * Constructs a new socket. Note that this does NOT actually connect the | 
 |    * socket. | 
 |    * | 
 |    * @param host An IP address or hostname to connect to | 
 |    * @param port The port to connect on | 
 |    */ | 
 |   TSocket(std::string host, int port); | 
 |  | 
 |   /** | 
 |    * Destroyes the socket object, closing it if necessary. | 
 |    */ | 
 |   virtual ~TSocket(); | 
 |  | 
 |   /** | 
 |    * Whether the socket is alive. | 
 |    * | 
 |    * @return Is the socket alive? | 
 |    */ | 
 |   bool isOpen(); | 
 |  | 
 |   /** | 
 |    * Calls select on the socket to see if there is more data available. | 
 |    */ | 
 |   bool peek(); | 
 |  | 
 |   /** | 
 |    * Creates and opens the UNIX socket. | 
 |    * | 
 |    * @throws TTransportException If the socket could not connect | 
 |    */ | 
 |   virtual void open(); | 
 |  | 
 |   /** | 
 |    * Shuts down communications on the socket. | 
 |    */ | 
 |   void close(); | 
 |  | 
 |   /** | 
 |    * Reads from the underlying socket. | 
 |    */ | 
 |   uint32_t read(uint8_t* buf, uint32_t len); | 
 |  | 
 |   /** | 
 |    * Writes to the underlying socket. | 
 |    */ | 
 |   void write(const uint8_t* buf, uint32_t len); | 
 |  | 
 |   /** | 
 |    * Get the host that the socket is connected to | 
 |    * | 
 |    * @return string host identifier | 
 |    */ | 
 |   std::string getHost(); | 
 |  | 
 |   /** | 
 |    * Get the port that the socket is connected to | 
 |    * | 
 |    * @return int port number | 
 |    */ | 
 |   int getPort(); | 
 |  | 
 |   /** | 
 |    * Set the host that socket will connect to | 
 |    * | 
 |    * @param host host identifier | 
 |    */ | 
 |   void setHost(std::string host); | 
 |  | 
 |   /** | 
 |    * Set the port that socket will connect to | 
 |    * | 
 |    * @param port port number | 
 |    */ | 
 |   void setPort(int port); | 
 |  | 
 |   /** | 
 |    * Controls whether the linger option is set on the socket. | 
 |    * | 
 |    * @param on      Whether SO_LINGER is on | 
 |    * @param linger  If linger is active, the number of seconds to linger for | 
 |    */ | 
 |   void setLinger(bool on, int linger); | 
 |  | 
 |   /** | 
 |    * Whether to enable/disable Nagle's algorithm. | 
 |    * | 
 |    * @param noDelay Whether or not to disable the algorithm. | 
 |    * @return | 
 |    */ | 
 |   void setNoDelay(bool noDelay); | 
 |  | 
 |   /** | 
 |    * Set the connect timeout | 
 |    */ | 
 |   void setConnTimeout(int ms); | 
 |  | 
 |   /** | 
 |    * Set the receive timeout | 
 |    */ | 
 |   void setRecvTimeout(int ms); | 
 |  | 
 |   /** | 
 |    * Set the send timeout | 
 |    */ | 
 |   void setSendTimeout(int ms); | 
 |  | 
 |   /** | 
 |    * Set the max number of recv retries in case of an EAGAIN | 
 |    * error | 
 |    */ | 
 |   void setMaxRecvRetries(int maxRecvRetries); | 
 |  | 
 |   /** | 
 |    * Get socket information formated as a string <Host: x Port: x> | 
 |    */ | 
 |   std::string getSocketInfo(); | 
 |  | 
 |   /** | 
 |    * Returns the DNS name of the host to which the socket is connected | 
 |    */ | 
 |   std::string getPeerHost(); | 
 |  | 
 |   /** | 
 |    * Returns the address of the host to which the socket is connected | 
 |    */ | 
 |   std::string getPeerAddress(); | 
 |  | 
 |   /** | 
 |    * Returns the port of the host to which the socket is connected | 
 |    **/ | 
 |   int getPeerPort(); | 
 |  | 
 |  | 
 |  protected: | 
 |   /** | 
 |    * Constructor to create socket from raw UNIX handle. Never called directly | 
 |    * but used by the TServerSocket class. | 
 |    */ | 
 |   TSocket(int socket); | 
 |  | 
 |   /** connect, called by open */ | 
 |   void openConnection(struct addrinfo *res); | 
 |  | 
 |   /** Host to connect to */ | 
 |   std::string host_; | 
 |  | 
 |   /** Peer hostname */ | 
 |   std::string peerHost_; | 
 |  | 
 |   /** Peer address */ | 
 |   std::string peerAddress_; | 
 |  | 
 |   /** Peer port */ | 
 |   int peerPort_; | 
 |  | 
 |   /** Port number to connect on */ | 
 |   int port_; | 
 |  | 
 |   /** Underlying UNIX socket handle */ | 
 |   int socket_; | 
 |  | 
 |   /** Connect timeout in ms */ | 
 |   int connTimeout_; | 
 |  | 
 |   /** Send timeout in ms */ | 
 |   int sendTimeout_; | 
 |  | 
 |   /** Recv timeout in ms */ | 
 |   int recvTimeout_; | 
 |  | 
 |   /** Linger on */ | 
 |   bool lingerOn_; | 
 |  | 
 |   /** Linger val */ | 
 |   int lingerVal_; | 
 |  | 
 |   /** Nodelay */ | 
 |   bool noDelay_; | 
 |  | 
 |   /** Recv EGAIN retries */ | 
 |   int maxRecvRetries_; | 
 |  | 
 |   /** Recv timeout timeval */ | 
 |   struct timeval recvTimeval_; | 
 | }; | 
 |  | 
 | }}} // apache::thrift::transport | 
 |  | 
 | #endif // #ifndef _THRIFT_TRANSPORT_TSOCKET_H_ | 
 |  |