00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef ROSCPP_TRANSPORT_TCP_H
00036 #define ROSCPP_TRANSPORT_TCP_H
00037
00038 #include <ros/types.h>
00039 #include <ros/transport/transport.h>
00040
00041 #include <boost/thread/recursive_mutex.hpp>
00042
00043 #include <netinet/in.h>
00044
00045 namespace ros
00046 {
00047
00048 class TransportTCP;
00049 typedef boost::shared_ptr<TransportTCP> TransportTCPPtr;
00050
00051 class PollSet;
00052
00056 class TransportTCP : public Transport
00057 {
00058 public:
00059 static bool s_use_keepalive_;
00060
00061 public:
00062 enum Flags
00063 {
00064 SYNCHRONOUS = 1<<0,
00065 };
00066
00067 TransportTCP(PollSet* poll_set, int flags = 0);
00068 virtual ~TransportTCP();
00069
00076 bool connect(const std::string& host, int port);
00077
00081 std::string getClientURI();
00082
00083 typedef boost::function<void(const TransportTCPPtr&)> AcceptCallback;
00090 bool listen(int port, int backlog, const AcceptCallback& accept_cb);
00094 TransportTCPPtr accept();
00098 int getServerPort() { return server_port_; }
00099
00100 void setNoDelay(bool nodelay);
00101 void setKeepAlive(bool use, uint32_t idle, uint32_t interval, uint32_t count);
00102
00103 const std::string& getConnectedHost() { return connected_host_; }
00104 int getConnectedPort() { return connected_port_; }
00105
00106
00107 virtual int32_t read(uint8_t* buffer, uint32_t size);
00108 virtual int32_t write(uint8_t* buffer, uint32_t size);
00109
00110 virtual void enableWrite();
00111 virtual void disableWrite();
00112 virtual void enableRead();
00113 virtual void disableRead();
00114
00115 virtual void close();
00116
00117 virtual std::string getTransportInfo();
00118
00119 virtual void parseHeader(const Header& header);
00120
00121 virtual const char* getType() { return "TCPROS"; }
00122
00123 private:
00127 bool initializeSocket();
00128
00129 bool setNonBlocking();
00130
00136 bool setSocket(int sock);
00137
00138 void socketUpdate(int events);
00139
00140 int sock_;
00141 bool closed_;
00142 boost::recursive_mutex close_mutex_;
00143
00144 bool expecting_read_;
00145 bool expecting_write_;
00146
00147 bool is_server_;
00148 sockaddr_in server_address_;
00149 int server_port_;
00150 AcceptCallback accept_cb_;
00151
00152 std::string cached_remote_host_;
00153
00154 PollSet* poll_set_;
00155 int flags_;
00156
00157 std::string connected_host_;
00158 int connected_port_;
00159 };
00160
00161 }
00162
00163 #endif // ROSCPP_TRANSPORT_TCP_H
00164