diff --git a/Makefile.am b/Makefile.am index a6b5b530..e61903d1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -361,8 +361,6 @@ test_apps = \ tests/test_xpub_welcome_msg \ tests/test_atomics \ tests/test_client_server \ - tests/test_server_drop_more \ - tests/test_client_drop_more \ tests/test_thread_safe \ tests/test_socketopt_hwm \ tests/test_heartbeats \ @@ -560,12 +558,6 @@ tests_test_atomics_LDADD = src/libzmq.la tests_test_client_server_SOURCES = tests/test_client_server.cpp tests_test_client_server_LDADD = src/libzmq.la -tests_test_server_drop_more_SOURCES = tests/test_server_drop_more.cpp -tests_test_server_drop_more_LDADD = src/libzmq.la - -tests_test_client_drop_more_SOURCES = tests/test_client_drop_more.cpp -tests_test_client_drop_more_LDADD = src/libzmq.la - tests_test_thread_safe_SOURCES = tests/test_thread_safe.cpp tests_test_thread_safe_LDADD = src/libzmq.la diff --git a/doc/zmq_getsockopt.txt b/doc/zmq_getsockopt.txt index 4795c88b..1ca6646e 100644 --- a/doc/zmq_getsockopt.txt +++ b/doc/zmq_getsockopt.txt @@ -691,8 +691,8 @@ Applicable socket types:: all, when using TCP transports. ZMQ_THREADSAFE: Retrieve socket thread safety ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The 'ZMQ_THREADSAFE' option shall retrieve a boolean value indicating whether -or not the socket is threadsafe. Currently only 'ZMQ_CLIENT' sockets are -threadsafe. +or not the socket is threadsafe. Currently 'ZMQ_CLIENT' and 'ZMQ_SERVER' sockets +are threadsafe. [horizontal] Option value type:: boolean diff --git a/doc/zmq_socket.txt b/doc/zmq_socket.txt index 8c7fa8da..2eac9f8d 100644 --- a/doc/zmq_socket.txt +++ b/doc/zmq_socket.txt @@ -65,8 +65,9 @@ after which either peer can send messages asynchronously, to the other. The client-server pattern is formally defined by http://rfc.zeromq.org/spec:41. -Note: this pattern deprecates the use of 'ZMQ_DEALER' and 'ZMQ_ROUTER' to build -client-server architectures. +Note: this pattern is meant to eventually deprecate the use of 'ZMQ_DEALER' and +'ZMQ_ROUTER' to build client-server architectures, as well as 'ZMQ_REP' and +'ZMQ_REQ' for request-reply. ZMQ_CLIENT ^^^^^^^^^^ @@ -92,6 +93,11 @@ the first client thread that calls libzmq:zmq_msg_recv. If you need to get replies back to the originating thread, use one 'ZMQ_CLIENT' socket per thread. +NOTE: 'ZMQ_CLIENT' sockets are threadsafe. They do not accept the ZMQ_SNDMORE +option on sends not ZMQ_RCVMORE on receives. This limits them to single part +data. The intention is to extend the API to allow scatter/gather of multi-part +data. + [horizontal] .Summary of ZMQ_CLIENT characteristics Compatible peer sockets:: 'ZMQ_SERVER' @@ -118,6 +124,11 @@ peer, the send call will fail with EHOSTUNREACH. If the outgoing buffer for the client peer is full, the send call will fail with EAGAIN. The 'ZMQ_SERVER' socket shall not drop messages, nor shall it block. +NOTE: 'ZMQ_SERVER' sockets are threadsafe. They do not accept the ZMQ_SNDMORE +option on sends not ZMQ_RCVMORE on receives. This limits them to single part +data. The intention is to extend the API to allow scatter/gather of multi-part +data. + [horizontal] .Summary of ZMQ_SERVER characteristics Compatible peer sockets:: 'ZMQ_CLIENT' diff --git a/tests/test_client_drop_more.cpp b/tests/test_client_drop_more.cpp deleted file mode 100644 index 1a38ebec..00000000 --- a/tests/test_client_drop_more.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - Copyright (c) 2007-2015 Contributors as noted in the AUTHORS file - - This file is part of libzmq, the ZeroMQ core engine in C++. - - libzmq is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License (LGPL) as published - by the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - As a special exception, the Contributors give you permission to link - this library with independent modules to produce an executable, - regardless of the license terms of these independent modules, and to - copy and distribute the resulting executable under terms of your choice, - provided that you also meet, for each linked independent module, the - terms and conditions of the license of that module. An independent - module is a module which is not derived from or based on this library. - If you modify this library, you must extend this exception to your - version of the library. - - libzmq 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 "testutil.hpp" - -int send_msg (zmq_msg_t* msg, void* s, int flags, int value); - -int main (void) -{ - setup_test_environment(); - void *ctx = zmq_ctx_new (); - assert (ctx); - - void *client = zmq_socket (ctx, ZMQ_CLIENT); - void *server = zmq_socket (ctx, ZMQ_SERVER); - - int rc; - - rc = zmq_bind (client, "inproc://serverdropmore"); - assert (rc == 0); - - rc = zmq_connect (server, "inproc://serverdropmore"); - assert (rc == 0); - - zmq_msg_t msg; - rc = zmq_msg_init (&msg); - assert (rc == 0); - - // we will send 2 3-frames messages and then single frame message, only last one should be received - rc = send_msg (&msg, client, ZMQ_SNDMORE, 1); - assert(rc == 1); - - rc = send_msg (&msg, client, ZMQ_SNDMORE, 2); - assert(rc == 1); - - rc = send_msg (&msg, client, 0, 3); - assert(rc == 1); - - rc = send_msg (&msg, client, ZMQ_SNDMORE, 4); - assert(rc == 1); - - rc = send_msg (&msg, client, ZMQ_SNDMORE, 5); - assert(rc == 1); - - rc = send_msg (&msg, client, 0, 6); - assert(rc == 1); - - rc = send_msg (&msg, client, 0, 7); - assert(rc == 1); - - rc = zmq_msg_recv (&msg, server, 0); - assert (rc == 1); - - assert (zmq_msg_more (&msg) == 0); - - unsigned char *data = (unsigned char*) zmq_msg_data (&msg); - assert (data [0] == 7); - - rc = zmq_msg_close (&msg); - assert (rc == 0); - - rc = zmq_close (client); - assert (rc == 0); - - rc = zmq_close (server); - assert (rc == 0); - - rc = zmq_ctx_term (ctx); - assert (rc == 0); - - return 0 ; -} - -int send_msg (zmq_msg_t *msg, void *s, int flags, int value) -{ - int rc = zmq_msg_close (msg); - if (rc != 0) - return rc; - - zmq_msg_init_size (msg, 1); - if (rc != 0) - return rc; - - unsigned char *data = (unsigned char *) zmq_msg_data (msg); - data [0] = (unsigned char) value; - - return zmq_msg_send (msg, s, flags); -} diff --git a/tests/test_server_drop_more.cpp b/tests/test_server_drop_more.cpp deleted file mode 100644 index e39b4c37..00000000 --- a/tests/test_server_drop_more.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - Copyright (c) 2007-2015 Contributors as noted in the AUTHORS file - - This file is part of libzmq, the ZeroMQ core engine in C++. - - libzmq is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License (LGPL) as published - by the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - As a special exception, the Contributors give you permission to link - this library with independent modules to produce an executable, - regardless of the license terms of these independent modules, and to - copy and distribute the resulting executable under terms of your choice, - provided that you also meet, for each linked independent module, the - terms and conditions of the license of that module. An independent - module is a module which is not derived from or based on this library. - If you modify this library, you must extend this exception to your - version of the library. - - libzmq 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 "testutil.hpp" - -int send_msg (zmq_msg_t* msg, void* s, int flags, int value); - -int main (void) -{ - setup_test_environment(); - void *ctx = zmq_ctx_new (); - assert (ctx); - - void *server = zmq_socket (ctx, ZMQ_SERVER); - void *client = zmq_socket (ctx, ZMQ_CLIENT); - - int rc; - - rc = zmq_bind (server, "inproc://serverdropmore"); - assert (rc == 0); - - rc = zmq_connect (client, "inproc://serverdropmore"); - assert (rc == 0); - - zmq_msg_t msg; - rc = zmq_msg_init (&msg); - assert (rc == 0); - - // we will send 2 3-frames messages and then single frame message, only last one should be received - rc = send_msg (&msg, client, ZMQ_SNDMORE, 1); - assert(rc == 1); - - rc = send_msg (&msg, client, ZMQ_SNDMORE, 2); - assert(rc == 1); - - rc = send_msg (&msg, client, 0, 3); - assert(rc == 1); - - rc = send_msg (&msg, client, ZMQ_SNDMORE, 4); - assert(rc == 1); - - rc = send_msg (&msg, client, ZMQ_SNDMORE, 5); - assert(rc == 1); - - rc = send_msg (&msg, client, 0, 6); - assert(rc == 1); - - rc = send_msg (&msg, client, 0, 7); - assert(rc == 1); - - rc = zmq_msg_recv (&msg, server, 0); - assert (rc == 1); - - assert (zmq_msg_more (&msg) == 0); - - unsigned char *data = (unsigned char*) zmq_msg_data (&msg); - assert (data [0] == 7); - - rc = zmq_msg_close (&msg); - assert (rc == 0); - - rc = zmq_close (server); - assert (rc == 0); - - rc = zmq_close (client); - assert (rc == 0); - - rc = zmq_ctx_term (ctx); - assert (rc == 0); - - return 0 ; -} - -int send_msg (zmq_msg_t *msg, void *s, int flags, int value) -{ - int rc = zmq_msg_close (msg); - if (rc != 0) - return rc; - - zmq_msg_init_size (msg, 1); - if (rc != 0) - return rc; - - unsigned char *data = (unsigned char *) zmq_msg_data (msg); - data [0] = (unsigned char) value; - - return zmq_msg_send (msg, s, flags); -}