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