diff --git a/.gitignore b/.gitignore index 57dc9040..7eac8490 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,7 @@ tests/test_disconnect_inproc tests/test_ctx_options tests/test_iov tests/test_security +tests/test_router_probe src/platform.hpp* src/stamp-h1 perf/local_lat diff --git a/doc/zmq_setsockopt.txt b/doc/zmq_setsockopt.txt index 6fa0cc75..3417fd09 100644 --- a/doc/zmq_setsockopt.txt +++ b/doc/zmq_setsockopt.txt @@ -13,8 +13,8 @@ SYNOPSIS *int zmq_setsockopt (void '*socket', int 'option_name', const void '*option_value', size_t 'option_len');* Caution: All options, with the exception of ZMQ_SUBSCRIBE, ZMQ_UNSUBSCRIBE, -ZMQ_LINGER, ZMQ_ROUTER_MANDATORY and ZMQ_XPUB_VERBOSE only take effect for -subsequent socket bind/connects. +ZMQ_LINGER, ZMQ_ROUTER_MANDATORY, ZMQ_PROBE, and ZMQ_XPUB_VERBOSE only take +effect for subsequent socket bind/connects. DESCRIPTION ----------- @@ -392,7 +392,7 @@ Applicable socket types:: all, only for connection-oriented transports. ZMQ_ROUTER_MANDATORY: accept only routable messages on ROUTER sockets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Sets the 'ROUTER' socket behavior when an unroutable message is encountered. A +Sets the ROUTER socket behavior when an unroutable message is encountered. A value of `0` is the default and discards the message silently when it cannot be routed. A value of `1` returns an 'EHOSTUNREACH' error code if the message cannot be routed. @@ -407,7 +407,7 @@ Applicable socket types:: ZMQ_ROUTER ZMQ_ROUTER_RAW: switch ROUTER socket to raw mode ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Sets the raw mode on the 'ROUTER', when set to 1. When the ROUTER socket is in +Sets the raw mode on the ROUTER, when set to 1. When the ROUTER socket is in raw mode, and when using the tcp:// transport, it will read and write TCP data without 0MQ framing. This lets 0MQ applications talk to non-0MQ applications. When using raw mode, you cannot set explicit identities, and the ZMQ_MSGMORE @@ -421,15 +421,17 @@ Default value:: 0 Applicable socket types:: ZMQ_ROUTER -ZMQ_PROBE: automatically send empty packet to every established connection -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ZMQ_PROBE: bootstrap connections to ROUTER sockets +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Sets the compatible sockets behavior to automatically send an empty packet -to any new connection made (or accepted) by socket. It could help sockets to -auto discovery them-self. It especially important in 'ROUTER' <-> 'ROUTER' connections -where it solves 'who will write first' problems. -NOTE: Don't set this options for sockets working with ZMQ_REP, ZMQ_REQ sockets. -It will interfere with their strict synchronous logic and framing. +When set to 1, the socket will automatically send an empty message when a +new connection is made or accepted. You may set this on REQ, DEALER, or +ROUTER sockets connected to a ROUTER socket. The application must filter +such empty messages. The ZMQ_PROBE option in effect provides the ROUTER +application with an event signaling the arrival of a new peer. + +NOTE: do not set this option on a socket that talks to any other socket +types: the results are undefined. [horizontal] Option value type:: int diff --git a/tests/Makefile.am b/tests/Makefile.am index 276609a8..249b4804 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -18,6 +18,7 @@ noinst_PROGRAMS = test_pair_inproc \ test_term_endpoint \ test_monitor \ test_router_mandatory \ + test_router_probe \ test_raw_sock \ test_disconnect_inproc \ test_ctx_options \ @@ -46,6 +47,7 @@ test_last_endpoint_SOURCES = test_last_endpoint.cpp test_term_endpoint_SOURCES = test_term_endpoint.cpp test_monitor_SOURCES = test_monitor.cpp test_router_mandatory_SOURCES = test_router_mandatory.cpp +test_router_probe_SOURCES = test_router_probe.cpp test_raw_sock_SOURCES = test_raw_sock.cpp test_disconnect_inproc_SOURCES = test_disconnect_inproc.cpp test_ctx_options_SOURCES = test_ctx_options.cpp diff --git a/tests/test_router_probe.cpp b/tests/test_router_probe.cpp new file mode 100644 index 00000000..38eb6fc7 --- /dev/null +++ b/tests/test_router_probe.cpp @@ -0,0 +1,75 @@ +/* + Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file + + This file is part of 0MQ. + + 0MQ is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + 0MQ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#include "../include/zmq.h" +#include +#include +#undef NDEBUG +#include + +int main (void) +{ + void *ctx = zmq_ctx_new (); + assert (ctx); + + // Create server and bind to endpoint + void *server = zmq_socket (ctx, ZMQ_ROUTER); + assert (server); + int rc = zmq_bind (server, "tcp://*:5560"); + assert (rc == 0); + + // Create client and connect to server, doing a probe + void *client = zmq_socket (ctx, ZMQ_DEALER); + assert (client); + rc = zmq_setsockopt (client, ZMQ_IDENTITY, "X", 1); + assert (rc == 0); + int probe = 1; + rc = zmq_setsockopt (client, ZMQ_PROBE, &probe, sizeof (probe)); + assert (rc == 0); + rc = zmq_connect (client, "tcp://localhost:5560"); + assert (rc == 0); + + // We expect an identity=X + empty message from client + unsigned char buffer [255]; + rc = zmq_recv (server, buffer, 255, 0); + assert (rc == 1); + assert (buffer [0] == 'X'); + rc = zmq_recv (server, buffer, 255, 0); + assert (rc == 0); + + // Send a message to client now + rc = zmq_send (server, "X", 1, ZMQ_SNDMORE); + assert (rc == 1); + rc = zmq_send (server, "Hello", 5, 0); + assert (rc == 5); + + rc = zmq_recv (client, buffer, 255, 0); + assert (rc == 5); + + rc = zmq_close (server); + assert (rc == 0); + + rc = zmq_close (client); + assert (rc == 0); + + rc = zmq_ctx_term (ctx); + assert (rc == 0); + + return 0 ; +}