25 #ifndef __ZMQ_HPP_INCLUDED__
26 #define __ZMQ_HPP_INCLUDED__
37 #if (defined(__GNUC__) && (__GNUC__ > 4 || \
38 (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && \
39 defined(__GXX_EXPERIMENTAL_CXX0X__))
40 #define ZMQ_HAS_RVALUE_REFS
41 #define ZMQ_DELETED_FUNCTION = delete
42 #elif defined(__clang__)
43 #if __has_feature(cxx_rvalue_references)
44 #define ZMQ_HAS_RVALUE_REFS
47 #if __has_feature(cxx_deleted_functions)
48 #define ZMQ_DELETED_FUNCTION = delete
50 #define ZMQ_DELETED_FUNCTION
52 #elif defined(_MSC_VER) && (_MSC_VER >= 1600)
53 #define ZMQ_HAS_RVALUE_REFS
54 #define ZMQ_DELETED_FUNCTION
56 #define ZMQ_DELETED_FUNCTION
59 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3, 3, 0)
60 #define ZMQ_NEW_MONITOR_EVENT_LAYOUT
66 # define ZMQ_ASSERT(expression) assert(expression)
68 # define ZMQ_ASSERT(expression) (void)(expression)
83 virtual const char *
what ()
const throw ()
85 return zmq_strerror (errnum);
98 inline int poll (zmq_pollitem_t *items_,
int nitems_,
long timeout_ = -1)
100 int rc = zmq_poll (items_, nitems_, timeout_);
106 inline void proxy (
void *frontend,
void *backend,
void *capture)
108 int rc = zmq_proxy (frontend, backend, capture);
113 inline void version (
int *major_,
int *minor_,
int *patch_)
115 zmq_version (major_, minor_, patch_);
126 int rc = zmq_msg_init (&msg);
133 int rc = zmq_msg_init_size (&msg, size_);
141 int rc = zmq_msg_init_data (&msg, data_, size_, ffn_, hint_);
146 #ifdef ZMQ_HAS_RVALUE_REFS
149 int rc = zmq_msg_init (&rhs.msg);
156 std::swap (msg, rhs.msg);
163 int rc = zmq_msg_close (&msg);
169 int rc = zmq_msg_close (&msg);
172 rc = zmq_msg_init (&msg);
179 int rc = zmq_msg_close (&msg);
182 rc = zmq_msg_init_size (&msg, size_);
190 int rc = zmq_msg_close (&msg);
193 rc = zmq_msg_init_data (&msg, data_, size_, ffn_, hint_);
200 int rc = zmq_msg_move (&msg, &(msg_->msg));
207 int rc = zmq_msg_copy (&msg, &(msg_->msg));
214 int rc = zmq_msg_more (&msg);
220 return zmq_msg_data (&msg);
223 inline const void*
data ()
const
225 return zmq_msg_data (const_cast<zmq_msg_t*>(&msg));
230 return zmq_msg_size (const_cast<zmq_msg_t*>(&msg));
260 ptr = zmq_ctx_new ();
268 ptr = zmq_ctx_new ();
272 int rc = zmq_ctx_set (ptr, ZMQ_IO_THREADS, io_threads_);
276 #ifdef ZMQ_HAS_RVALUE_REFS
283 std::swap (ptr, rhs.ptr);
297 int rc = zmq_ctx_destroy (ptr);
305 inline operator void* ()
325 ctxptr = context_.ptr;
326 ptr = zmq_socket (context_.ptr, type_);
331 #ifdef ZMQ_HAS_RVALUE_REFS
338 std::swap(ptr, rhs.ptr);
348 inline operator void* ()
358 int rc = zmq_close (ptr);
366 int rc = zmq_setsockopt (ptr, option_, optval_, optvallen_);
374 int rc = zmq_getsockopt (ptr, option_, optval_, optvallen_);
379 inline void bind (
const char *addr_)
381 int rc = zmq_bind (ptr, addr_);
388 int rc = zmq_unbind (ptr, addr_);
395 int rc = zmq_connect (ptr, addr_);
402 int rc = zmq_disconnect (ptr, addr_);
412 inline size_t send (
const void *buf_,
size_t len_,
int flags_ = 0)
414 int nbytes = zmq_send (ptr, buf_, len_, flags_);
416 return (
size_t) nbytes;
417 if (zmq_errno () == EAGAIN)
424 int nbytes = zmq_msg_send (&(msg_.msg), ptr, flags_);
427 if (zmq_errno () == EAGAIN)
432 inline size_t recv (
void *buf_,
size_t len_,
int flags_ = 0)
434 int nbytes = zmq_recv (ptr, buf_, len_, flags_);
436 return (
size_t) nbytes;
437 if (zmq_errno () == EAGAIN)
444 int nbytes = zmq_msg_recv (&(msg_->msg), ptr, flags_);
447 if (zmq_errno () == EAGAIN)
457 void operator = (const
socket_t&) ZMQ_DELETED_FUNCTION;
466 void monitor(
socket_t &socket,
const char *addr_,
int events = ZMQ_EVENT_ALL)
468 int rc = zmq_socket_monitor(socket.ptr, addr_, events);
472 socketPtr = socket.ptr;
473 void *s = zmq_socket (socket.ctxptr, ZMQ_PAIR);
476 rc = zmq_connect (s, addr_);
479 on_monitor_started();
483 zmq_msg_init (&eventMsg);
484 rc = zmq_recvmsg (s, &eventMsg, 0);
485 if (rc == -1 && zmq_errno() == ETERM)
488 zmq_event_t*
event =
static_cast<zmq_event_t*
>(zmq_msg_data (&eventMsg));
490 #ifdef ZMQ_NEW_MONITOR_EVENT_LAYOUT
492 zmq_msg_init (&addrMsg);
493 rc = zmq_recvmsg (s, &addrMsg, 0);
494 if (rc == -1 && zmq_errno() == ETERM)
497 const char* str =
static_cast<const char*
>(zmq_msg_data (&addrMsg));
498 std::string address(str, str + zmq_msg_size(&addrMsg));
499 zmq_msg_close (&addrMsg);
502 std::string address =
event->data.connected.addr;
505 #ifdef ZMQ_EVENT_MONITOR_STOPPED
506 if (event->event == ZMQ_EVENT_MONITOR_STOPPED)
510 switch (event->event) {
511 case ZMQ_EVENT_CONNECTED:
512 on_event_connected(*event, address.c_str());
514 case ZMQ_EVENT_CONNECT_DELAYED:
515 on_event_connect_delayed(*event, address.c_str());
517 case ZMQ_EVENT_CONNECT_RETRIED:
518 on_event_connect_retried(*event, address.c_str());
520 case ZMQ_EVENT_LISTENING:
521 on_event_listening(*event, address.c_str());
523 case ZMQ_EVENT_BIND_FAILED:
524 on_event_bind_failed(*event, address.c_str());
526 case ZMQ_EVENT_ACCEPTED:
527 on_event_accepted(*event, address.c_str());
529 case ZMQ_EVENT_ACCEPT_FAILED:
530 on_event_accept_failed(*event, address.c_str());
532 case ZMQ_EVENT_CLOSED:
533 on_event_closed(*event, address.c_str());
535 case ZMQ_EVENT_CLOSE_FAILED:
536 on_event_close_failed(*event, address.c_str());
538 case ZMQ_EVENT_DISCONNECTED:
539 on_event_disconnected(*event, address.c_str());
542 on_event_unknown(*event, address.c_str());
545 zmq_msg_close (&eventMsg);
551 #ifdef ZMQ_EVENT_MONITOR_STOPPED
555 zmq_socket_monitor(socketPtr, NULL, 0);
559 virtual void on_event_connected(
const zmq_event_t &event_,
const char* addr_) { (void)event_; (void)addr_; }
562 virtual void on_event_listening(
const zmq_event_t &event_,
const char* addr_) { (void)event_; (void)addr_; }
564 virtual void on_event_accepted(
const zmq_event_t &event_,
const char* addr_) { (void)event_; (void)addr_; }
566 virtual void on_event_closed(
const zmq_event_t &event_,
const char* addr_) { (void)event_; (void)addr_; }
569 virtual void on_event_unknown(
const zmq_event_t &event_,
const char* addr_) { (void)event_; (void)addr_; }