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_; }