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_UDP_H
00036 #define ROSCPP_TRANSPORT_UDP_H
00037
00038 #include <ros/types.h>
00039 #include <ros/transport/transport.h>
00040
00041 #include <boost/thread/mutex.hpp>
00042
00043 #include <netinet/in.h>
00044
00045 namespace ros
00046 {
00047
00048 class TransportUDP;
00049 typedef boost::shared_ptr<TransportUDP> TransportUDPPtr;
00050
00051 class PollSet;
00052
00053 #define ROS_UDP_DATA0 0
00054 #define ROS_UDP_DATAN 1
00055 #define ROS_UDP_PING 2
00056 #define ROS_UDP_ERR 3
00057 typedef struct TransportUDPHeader {
00058 uint32_t connection_id_;
00059 uint8_t op_;
00060 uint8_t message_id_;
00061 uint16_t block_;
00062 } TransportUDPHeader;
00063
00067 class TransportUDP : public Transport
00068 {
00069 public:
00070 enum Flags
00071 {
00072 SYNCHRONOUS = 1<<0,
00073 };
00074
00075 TransportUDP(PollSet* poll_set, int flags = 0, int max_datagram_size = 0);
00076 virtual ~TransportUDP();
00077
00084 bool connect(const std::string& host, int port, int conn_id);
00085
00089 std::string getClientURI();
00090
00095 bool createIncoming(int port, bool is_server);
00099 TransportUDPPtr createOutgoing(std::string host, int port, int conn_id, int max_datagram_size);
00103 int getServerPort() const {return server_port_;}
00104
00105
00106 virtual int32_t read(uint8_t* buffer, uint32_t size);
00107 virtual int32_t write(uint8_t* buffer, uint32_t size);
00108
00109 virtual void enableWrite();
00110 virtual void disableWrite();
00111 virtual void enableRead();
00112 virtual void disableRead();
00113
00114 virtual void close();
00115
00116 virtual std::string getTransportInfo();
00117
00118 virtual bool requiresHeader() {return false;}
00119
00120 virtual const char* getType() {return "UDPROS";}
00121
00122 int getMaxDatagramSize() const {return max_datagram_size_;}
00123
00124 private:
00128 bool initializeSocket();
00129
00135 bool setSocket(int sock);
00136
00137 void socketUpdate(int events);
00138
00139 int sock_;
00140 bool closed_;
00141 boost::mutex close_mutex_;
00142
00143 bool expecting_read_;
00144 bool expecting_write_;
00145
00146 bool is_server_;
00147 sockaddr_in server_address_;
00148 int server_port_;
00149
00150 std::string cached_remote_host_;
00151
00152 PollSet* poll_set_;
00153 int flags_;
00154
00155 uint32_t connection_id_;
00156 uint8_t current_message_id_;
00157 uint16_t total_blocks_;
00158 uint16_t last_block_;
00159
00160 uint32_t max_datagram_size_;
00161
00162 uint8_t* data_buffer_;
00163 uint8_t* data_start_;
00164 uint32_t data_filled_;
00165
00166 uint8_t* reorder_buffer_;
00167 uint8_t* reorder_start_;
00168 TransportUDPHeader reorder_header_;
00169 uint32_t reorder_bytes_;
00170 };
00171
00172 }
00173
00174 #endif // ROSCPP_TRANSPORT_UDP_H
00175