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