mirror of
https://github.com/zeromq/libzmq.git
synced 2025-01-08 19:04:09 +01:00
e7f0090b16
Solution: delay connecting the peer pipe until the handshake is completed
93 lines
2.5 KiB
C++
93 lines
2.5 KiB
C++
|
|
#ifndef __ZMQ_UDP_ENGINE_HPP_INCLUDED__
|
|
#define __ZMQ_UDP_ENGINE_HPP_INCLUDED__
|
|
|
|
#include "io_object.hpp"
|
|
#include "i_engine.hpp"
|
|
#include "address.hpp"
|
|
#include "msg.hpp"
|
|
|
|
#define MAX_UDP_MSG 8192
|
|
|
|
namespace zmq
|
|
{
|
|
class io_thread_t;
|
|
class session_base_t;
|
|
|
|
class udp_engine_t ZMQ_FINAL : public io_object_t, public i_engine
|
|
{
|
|
public:
|
|
udp_engine_t (const options_t &options_);
|
|
~udp_engine_t ();
|
|
|
|
int init (address_t *address_, bool send_, bool recv_);
|
|
|
|
bool has_handshake_stage () ZMQ_FINAL { return false; };
|
|
|
|
// i_engine interface implementation.
|
|
// Plug the engine to the session.
|
|
void plug (zmq::io_thread_t *io_thread_, class session_base_t *session_);
|
|
|
|
// Terminate and deallocate the engine. Note that 'detached'
|
|
// events are not fired on termination.
|
|
void terminate ();
|
|
|
|
// This method is called by the session to signalise that more
|
|
// messages can be written to the pipe.
|
|
bool restart_input ();
|
|
|
|
// This method is called by the session to signalise that there
|
|
// are messages to send available.
|
|
void restart_output ();
|
|
|
|
void zap_msg_available (){};
|
|
|
|
void in_event ();
|
|
void out_event ();
|
|
|
|
const endpoint_uri_pair_t &get_endpoint () const;
|
|
|
|
private:
|
|
int resolve_raw_address (const char *name_, size_t length_);
|
|
static void sockaddr_to_msg (zmq::msg_t *msg_, const sockaddr_in *addr_);
|
|
|
|
static int set_udp_reuse_address (fd_t s_, bool on_);
|
|
static int set_udp_reuse_port (fd_t s_, bool on_);
|
|
// Indicate, if the multicast data being sent should be looped back
|
|
static int set_udp_multicast_loop (fd_t s_, bool is_ipv6_, bool loop_);
|
|
// Set multicast TTL
|
|
static int set_udp_multicast_ttl (fd_t s_, bool is_ipv6_, int hops_);
|
|
// Set multicast address/interface
|
|
int set_udp_multicast_iface (fd_t s_,
|
|
bool is_ipv6_,
|
|
const udp_address_t *addr_);
|
|
// Join a multicast group
|
|
int add_membership (fd_t s_, const udp_address_t *addr_);
|
|
|
|
// Function to handle network issues.
|
|
void error (error_reason_t reason_);
|
|
|
|
const endpoint_uri_pair_t _empty_endpoint;
|
|
|
|
bool _plugged;
|
|
|
|
fd_t _fd;
|
|
session_base_t *_session;
|
|
handle_t _handle;
|
|
address_t *_address;
|
|
|
|
options_t _options;
|
|
|
|
sockaddr_in _raw_address;
|
|
const struct sockaddr *_out_address;
|
|
zmq_socklen_t _out_address_len;
|
|
|
|
char _out_buffer[MAX_UDP_MSG];
|
|
char _in_buffer[MAX_UDP_MSG];
|
|
bool _send_enabled;
|
|
bool _recv_enabled;
|
|
};
|
|
}
|
|
|
|
#endif
|