1 2 #ifndef __ZMQ_UDP_ENGINE_HPP_INCLUDED__ 3 #define __ZMQ_UDP_ENGINE_HPP_INCLUDED__ 4 5 #include "io_object.hpp" 6 #include "i_engine.hpp" 7 #include "address.hpp" 8 #include "msg.hpp" 9 10 #define MAX_UDP_MSG 8192 11 12 namespace zmq 13 { 14 class io_thread_t; 15 class session_base_t; 16 17 class udp_engine_t ZMQ_FINAL : public io_object_t, public i_engine 18 { 19 public: 20 udp_engine_t (const options_t &options_); 21 ~udp_engine_t (); 22 23 int init (address_t *address_, bool send_, bool recv_); 24 has_handshake_stage()25 bool has_handshake_stage () ZMQ_FINAL { return false; }; 26 27 // i_engine interface implementation. 28 // Plug the engine to the session. 29 void plug (zmq::io_thread_t *io_thread_, class session_base_t *session_); 30 31 // Terminate and deallocate the engine. Note that 'detached' 32 // events are not fired on termination. 33 void terminate (); 34 35 // This method is called by the session to signalise that more 36 // messages can be written to the pipe. 37 bool restart_input (); 38 39 // This method is called by the session to signalise that there 40 // are messages to send available. 41 void restart_output (); 42 zap_msg_available()43 void zap_msg_available (){}; 44 45 void in_event (); 46 void out_event (); 47 48 const endpoint_uri_pair_t &get_endpoint () const; 49 50 private: 51 int resolve_raw_address (const char *name_, size_t length_); 52 static void sockaddr_to_msg (zmq::msg_t *msg_, const sockaddr_in *addr_); 53 54 static int set_udp_reuse_address (fd_t s_, bool on_); 55 static int set_udp_reuse_port (fd_t s_, bool on_); 56 // Indicate, if the multicast data being sent should be looped back 57 static int set_udp_multicast_loop (fd_t s_, bool is_ipv6_, bool loop_); 58 // Set multicast TTL 59 static int set_udp_multicast_ttl (fd_t s_, bool is_ipv6_, int hops_); 60 // Set multicast address/interface 61 int set_udp_multicast_iface (fd_t s_, 62 bool is_ipv6_, 63 const udp_address_t *addr_); 64 // Join a multicast group 65 int add_membership (fd_t s_, const udp_address_t *addr_); 66 67 // Function to handle network issues. 68 void error (error_reason_t reason_); 69 70 const endpoint_uri_pair_t _empty_endpoint; 71 72 bool _plugged; 73 74 fd_t _fd; 75 session_base_t *_session; 76 handle_t _handle; 77 address_t *_address; 78 79 options_t _options; 80 81 sockaddr_in _raw_address; 82 const struct sockaddr *_out_address; 83 zmq_socklen_t _out_address_len; 84 85 char _out_buffer[MAX_UDP_MSG]; 86 char _in_buffer[MAX_UDP_MSG]; 87 bool _send_enabled; 88 bool _recv_enabled; 89 }; 90 } 91 92 #endif 93