diff options
| -rw-r--r-- | doc/zmq_getsockopt.txt | 19 | ||||
| -rw-r--r-- | doc/zmq_setsockopt.txt | 19 | ||||
| -rw-r--r-- | include/zmq.h | 1 | ||||
| -rw-r--r-- | src/options.cpp | 19 | ||||
| -rw-r--r-- | src/options.hpp | 3 | ||||
| -rw-r--r-- | src/xsub.cpp | 4 | 
6 files changed, 62 insertions, 3 deletions
diff --git a/doc/zmq_getsockopt.txt b/doc/zmq_getsockopt.txt index 97b4032..b48b06b 100644 --- a/doc/zmq_getsockopt.txt +++ b/doc/zmq_getsockopt.txt @@ -297,7 +297,7 @@ Applicable socket types:: all  ZMQ_MULTICAST_HOPS: Maximum network hops for multicast packets  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The option shell retrieve time-to-live used for outbound multicast packets. +The option shall retrieve time-to-live used for outbound multicast packets.  The default of 1 means that the multicast packets don't leave the local network.  [horizontal] @@ -307,6 +307,23 @@ Default value:: 1  Applicable socket types:: all, when using multicast transports +ZMQ_FILTER: Switches message filtering on or off +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The option shall retrieve the filtering behaiour of the socket. +If 1, messages are filtered according to subcriptions as expected. +If 0, messages are not filtered. This is a performance tweak. If a device +receives a message from XSUB socket and it is about to send it to XPUB socket +immediately, filtering would be done twice. We can thus turn off filtering in +XSUB socket and rely on filtering in XPUB socket. + +[horizontal] +Option value type:: int +Option value unit:: boolean +Default value:: 1 +Applicable socket types:: ZMQ_SUB, ZMQ_XSUB + +  ZMQ_FD: Retrieve file descriptor associated with the socket  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  The 'ZMQ_FD' option shall retrieve the file descriptor associated with the diff --git a/doc/zmq_setsockopt.txt b/doc/zmq_setsockopt.txt index ed3b3a7..4b639c5 100644 --- a/doc/zmq_setsockopt.txt +++ b/doc/zmq_setsockopt.txt @@ -284,6 +284,7 @@ Option value unit:: connections  Default value:: 100  Applicable socket types:: all, only for connection-oriented transports. +  ZMQ_MAXMSGSIZE: Maximum acceptable inbound message size  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -296,6 +297,7 @@ Option value unit:: bytes  Default value:: -1  Applicable socket types:: all +  ZMQ_MULTICAST_HOPS: Maximum network hops for multicast packets  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -309,6 +311,23 @@ Option value unit:: network hops  Default value:: 1  Applicable socket types:: all, when using multicast transports + +ZMQ_FILTER: Switches message filtering on or off +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If set to 1, messages are filtered according to subcriptions as expected. +If set to 0, messages are not filtered. This is a performance tweak. If a device +receives a message from XSUB socket and it is about to send it to XPUB socket +immediately, filtering would be done twice. We can thus turn off filtering in +XSUB socket and rely on filtering in XPUB socket. + +[horizontal] +Option value type:: int +Option value unit:: boolean +Default value:: 1 +Applicable socket types:: ZMQ_SUB, ZMQ_XSUB + +  RETURN VALUE  ------------  The _zmq_setsockopt()_ function shall return zero if successful. Otherwise it diff --git a/include/zmq.h b/include/zmq.h index 40dffd9..8d1d57b 100644 --- a/include/zmq.h +++ b/include/zmq.h @@ -180,6 +180,7 @@ ZMQ_EXPORT int zmq_term (void *context);  #define ZMQ_SNDHWM 23  #define ZMQ_RCVHWM 24  #define ZMQ_MULTICAST_HOPS 25 +#define ZMQ_FILTER 26  /*  Send/recv options.                                                        */  #define ZMQ_DONTWAIT 1 diff --git a/src/options.cpp b/src/options.cpp index 271ebdb..29cf023 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -38,6 +38,7 @@ zmq::options_t::options_t () :      reconnect_ivl_max (0),      backlog (100),      maxmsgsize (-1), +    filter (1),      immediate_connect (true)  {  } @@ -172,6 +173,15 @@ int zmq::options_t::setsockopt (int option_, const void *optval_,          multicast_hops = *((int*) optval_);          return 0; +    case ZMQ_FILTER: +        if (optvallen_ != sizeof (int) || (*((int*) optval_) != 0 && +                *((int*) optval_) != 1)) { +            errno = EINVAL; +            return -1; +        } +        filter = *((int*) optval_); +        return 0; +      }      errno = EINVAL; @@ -317,6 +327,15 @@ int zmq::options_t::getsockopt (int option_, void *optval_, size_t *optvallen_)          *optvallen_ = sizeof (int);          return 0; +    case ZMQ_FILTER: +        if (*optvallen_ < sizeof (int)) { +            errno = EINVAL; +            return -1; +        } +        *((int*) optval_) = filter; +        *optvallen_ = sizeof (int); +        return 0; +      }      errno = EINVAL; diff --git a/src/options.hpp b/src/options.hpp index fd39a74..e055919 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -75,6 +75,9 @@ namespace zmq          //  Maximal size of message to handle.          int64_t maxmsgsize; +        //  If 1, (X)SUB socket should filter the messages. If 0, it should not. +        int filter; +          //  If true, when connecting, pipes are created immediately without          //  waiting for the connection to be established. That way the socket          //  is not aware of the peer's identity, however, it is able to send diff --git a/src/xsub.cpp b/src/xsub.cpp index a847d7f..60ba598 100644 --- a/src/xsub.cpp +++ b/src/xsub.cpp @@ -133,7 +133,7 @@ int zmq::xsub_t::xrecv (msg_t *msg_, int flags_)          //  Check whether the message matches at least one subscription.          //  Non-initial parts of the message are passed  -        if (more || match (msg_)) { +        if (more || !options.filter || match (msg_)) {              more = msg_->flags () & msg_t::more;              return 0;          } @@ -173,7 +173,7 @@ bool zmq::xsub_t::xhas_in ()          }          //  Check whether the message matches at least one subscription. -        if (match (&message)) { +        if (!options.filter || match (&message)) {              has_message = true;              return true;          }  | 
