|  | /* | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements. See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership. The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License. You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied. See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | */ | 
|  |  | 
|  | #ifndef _THRIFT_TRANSPORT_TSOCKET_H_ | 
|  | #define _THRIFT_TRANSPORT_TSOCKET_H_ 1 | 
|  |  | 
|  | #include <string> | 
|  | #include <sys/time.h> | 
|  | #include <netdb.h> | 
|  |  | 
|  | #include "TTransport.h" | 
|  | #include "TVirtualTransport.h" | 
|  | #include "TServerSocket.h" | 
|  |  | 
|  | namespace apache { namespace thrift { namespace transport { | 
|  |  | 
|  | /** | 
|  | * TCP Socket implementation of the TTransport interface. | 
|  | * | 
|  | */ | 
|  | class TSocket : public TVirtualTransport<TSocket> { | 
|  | 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); | 
|  |  | 
|  | /** | 
|  | * Constructs a new Unix domain socket. | 
|  | * Note that this does NOT actually connect the socket. | 
|  | * | 
|  | * @param path The Unix domain socket e.g. "/tmp/ThriftTest.binary.thrift" | 
|  | */ | 
|  | TSocket(std::string path); | 
|  |  | 
|  | /** | 
|  | * 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. | 
|  | */ | 
|  | virtual void close(); | 
|  |  | 
|  | /** | 
|  | * Reads from the underlying socket. | 
|  | */ | 
|  | uint32_t read(uint8_t* buf, uint32_t len); | 
|  |  | 
|  | /** | 
|  | * Writes to the underlying socket.  Loops until done or fail. | 
|  | */ | 
|  | void write(const uint8_t* buf, uint32_t len); | 
|  |  | 
|  | /** | 
|  | * Writes to the underlying socket.  Does single send() and returns result. | 
|  | */ | 
|  | uint32_t write_partial(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(); | 
|  |  | 
|  | /** | 
|  | * Returns the underlying socket file descriptor. | 
|  | */ | 
|  | int getSocketFD() { | 
|  | return socket_; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * (Re-)initialize a TSocket for the supplied descriptor.  This is only | 
|  | * intended for use by TNonblockingServer -- other use may result in | 
|  | * unfortunate surprises. | 
|  | * | 
|  | * @param fd the descriptor for an already-connected socket | 
|  | */ | 
|  | void setSocketFD(int fd); | 
|  |  | 
|  | /* | 
|  | * Returns a cached copy of the peer address. | 
|  | */ | 
|  | sockaddr* getCachedAddress(socklen_t* len) const; | 
|  |  | 
|  | /** | 
|  | * Sets whether to use a low minimum TCP retransmission timeout. | 
|  | */ | 
|  | static void setUseLowMinRto(bool useLowMinRto); | 
|  |  | 
|  | /** | 
|  | * Gets whether to use a low minimum TCP retransmission timeout. | 
|  | */ | 
|  | static bool getUseLowMinRto(); | 
|  |  | 
|  | /** | 
|  | * Constructor to create socket from raw UNIX handle. | 
|  | */ | 
|  | TSocket(int socket); | 
|  |  | 
|  | /** | 
|  | * Set a cache of the peer address (used when trivially available: e.g. | 
|  | * accept() or connect()). Only caches IPV4 and IPV6; unset for others. | 
|  | */ | 
|  | void setCachedAddress(const sockaddr* addr, socklen_t len); | 
|  |  | 
|  | protected: | 
|  | /** 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_; | 
|  |  | 
|  | /** UNIX domain socket path */ | 
|  | std::string path_; | 
|  |  | 
|  | /** 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_; | 
|  |  | 
|  | /** Cached peer address */ | 
|  | union { | 
|  | sockaddr_in ipv4; | 
|  | sockaddr_in6 ipv6; | 
|  | } cachedPeerAddr_; | 
|  |  | 
|  | /** Connection start time */ | 
|  | timespec startTime_; | 
|  |  | 
|  | /** Whether to use low minimum TCP retransmission timeout */ | 
|  | static bool useLowMinRto_; | 
|  |  | 
|  | private: | 
|  | void unix_open(); | 
|  | void local_open(); | 
|  | }; | 
|  |  | 
|  | }}} // apache::thrift::transport | 
|  |  | 
|  | #endif // #ifndef _THRIFT_TRANSPORT_TSOCKET_H_ | 
|  |  |