Commit afc7c5c7 authored by Pieter Hintjens's avatar Pieter Hintjens

Merge pull request #1641 from c-rack/fix-recv-send-buffer

Solution: change behaviour of tcp_send/recv_buffer_size option
parents f80faeca fc1099ff
...@@ -114,6 +114,7 @@ test_server_drop_more ...@@ -114,6 +114,7 @@ test_server_drop_more
test_thread_safe test_thread_safe
test_thread_safe_polling test_thread_safe_polling
test_getsockopt_memset test_getsockopt_memset
test_setsockopt
test_stream_exceeds_buffer test_stream_exceeds_buffer
test_poller test_poller
tests/test*.log tests/test*.log
......
...@@ -351,6 +351,7 @@ test_apps = \ ...@@ -351,6 +351,7 @@ test_apps = \
tests/test_proxy_single_socket \ tests/test_proxy_single_socket \
tests/test_proxy_terminate \ tests/test_proxy_terminate \
tests/test_getsockopt_memset \ tests/test_getsockopt_memset \
tests/test_setsockopt \
tests/test_many_sockets \ tests/test_many_sockets \
tests/test_ipc_wildcard \ tests/test_ipc_wildcard \
tests/test_diffserv \ tests/test_diffserv \
...@@ -566,6 +567,9 @@ tests_test_thread_safe_LDADD = src/libzmq.la ...@@ -566,6 +567,9 @@ tests_test_thread_safe_LDADD = src/libzmq.la
tests_test_socketopt_hwm_SOURCES = tests/test_sockopt_hwm.cpp tests_test_socketopt_hwm_SOURCES = tests/test_sockopt_hwm.cpp
tests_test_socketopt_hwm_LDADD = src/libzmq.la tests_test_socketopt_hwm_LDADD = src/libzmq.la
tests_test_setsockopt_SOURCES = tests/test_setsockopt.cpp
tests_test_setsockopt_LDADD = src/libzmq.la
tests_test_heartbeats_SOURCES = tests/test_heartbeats.cpp tests_test_heartbeats_SOURCES = tests/test_heartbeats.cpp
tests_test_heartbeats_LDADD = src/libzmq.la tests_test_heartbeats_LDADD = src/libzmq.la
......
...@@ -738,30 +738,28 @@ Applicable socket types:: all, when using TCP transport ...@@ -738,30 +738,28 @@ Applicable socket types:: all, when using TCP transport
ZMQ_TCP_RECV_BUFFER: Size of the TCP receive buffer ZMQ_TCP_RECV_BUFFER: Size of the TCP receive buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The 'ZMQ_RECV_BUFFER' specifies the maximum number of bytes which can The 'ZMQ_TCP_RECV_BUFFER' specifies the maximum number of bytes which can
be received by an individual syscall to receive data from the TCP be received by an individual syscall to receive data from the TCP socket.
socket. The buffer size is specified as an integer number from 0 (very small) The default value is 8192.
to 10 (very large). The default value is 3.
[horizontal] [horizontal]
Option value type:: int Option value type:: int
Option value unit:: N/A Option value unit:: >0
Default value:: 3 Default value:: 8192
Applicable socket types:: all, when using TCP transport Applicable socket types:: all, when using TCP transport
ZMQ_TCP_SEND_BUFFER: Size of the TCP receive buffer ZMQ_TCP_SEND_BUFFER: Size of the TCP receive buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The 'ZMQ_SEND_BUFFER' specifies the maximum number of bytes which can The 'ZMQ_TCP_SEND_BUFFER' specifies the maximum number of bytes which can
be sent by an individual syscall to transmit data to the TCP be sent by an individual syscall to transmit data to the TCP socket.
socket. The buffer size is specified as an integer number from 0 (very small) The default value is 8192.
to 10 (very large). The default value is 3.
[horizontal] [horizontal]
Option value type:: int Option value type:: int
Option value unit:: N/A Option value unit:: >0
Default value:: 3 Default value:: 8192
Applicable socket types:: all, when using TCP transport Applicable socket types:: all, when using TCP transport
RETURN VALUE RETURN VALUE
......
...@@ -1073,30 +1073,28 @@ Applicable socket types:: all, when using TCP transports. ...@@ -1073,30 +1073,28 @@ Applicable socket types:: all, when using TCP transports.
ZMQ_TCP_RECV_BUFFER: Size of the TCP receive buffer ZMQ_TCP_RECV_BUFFER: Size of the TCP receive buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The 'ZMQ_RECV_BUFFER' specifies the maximum number of bytes which can The 'ZMQ_TCP_RECV_BUFFER' specifies the maximum number of bytes which can
be received by an individual syscall to receive data from the TCP be received by an individual syscall to receive data from the TCP socket.
socket. The buffer size is specified as an integer number from 0 (very small) The default value is 8192.
to 10 (very large). The default value is 3.
[horizontal] [horizontal]
Option value type:: int Option value type:: int
Option value unit:: N/A Option value unit:: >0
Default value:: 3 Default value:: 8192
Applicable socket types:: all, when using TCP transport Applicable socket types:: all, when using TCP transport
ZMQ_TCP_SEND_BUFFER: Size of the TCP receive buffer ZMQ_TCP_SEND_BUFFER: Size of the TCP receive buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The 'ZMQ_SEND_BUFFER' specifies the maximum number of bytes which can The 'ZMQ_TCP_SEND_BUFFER' specifies the maximum number of bytes which can
be sent by an individual syscall to transmit data to the TCP be sent by an individual syscall to transmit data to the TCP socket.
socket. The buffer size is specified as an integer number from 0 (very small) The default value is 8192.
to 10 (very large). The default value is 3.
[horizontal] [horizontal]
Option value type:: int Option value type:: int
Option value unit:: N/A Option value unit:: >0
Default value:: 3 Default value:: 8192
Applicable socket types:: all, when using TCP transport Applicable socket types:: all, when using TCP transport
RETURN VALUE RETURN VALUE
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
*/ */
#include <string.h> #include <string.h>
#include <cmath>
#include "options.hpp" #include "options.hpp"
#include "err.hpp" #include "err.hpp"
...@@ -66,8 +65,8 @@ zmq::options_t::options_t () : ...@@ -66,8 +65,8 @@ zmq::options_t::options_t () :
tcp_keepalive_cnt (-1), tcp_keepalive_cnt (-1),
tcp_keepalive_idle (-1), tcp_keepalive_idle (-1),
tcp_keepalive_intvl (-1), tcp_keepalive_intvl (-1),
tcp_recv_buffer_size (3), tcp_recv_buffer_size (8192),
tcp_send_buffer_size (3), tcp_send_buffer_size (8192),
mechanism (ZMQ_NULL), mechanism (ZMQ_NULL),
as_server (0), as_server (0),
gss_plaintext (false), gss_plaintext (false),
...@@ -284,14 +283,16 @@ int zmq::options_t::setsockopt (int option_, const void *optval_, ...@@ -284,14 +283,16 @@ int zmq::options_t::setsockopt (int option_, const void *optval_,
break; break;
case ZMQ_TCP_RECV_BUFFER: case ZMQ_TCP_RECV_BUFFER:
if (is_int && (value >= 0 && value <= 10) ) { if (is_int && (value > 0) ) {
tcp_recv_buffer_size = static_cast<unsigned int>(std::pow(2.0, value)) * 1024; tcp_recv_buffer_size = static_cast<unsigned int>(value);
return 0;
} }
break; break;
case ZMQ_TCP_SEND_BUFFER: case ZMQ_TCP_SEND_BUFFER:
if (is_int && (value >= 0 && value <= 10) ) { if (is_int && (value > 0) ) {
tcp_send_buffer_size = static_cast<unsigned int>(std::pow(2.0, value)) * 1024; tcp_send_buffer_size = static_cast<unsigned int>(value);
return 0;
} }
break; break;
......
...@@ -50,6 +50,7 @@ set(tests ...@@ -50,6 +50,7 @@ set(tests
test_pub_invert_matching test_pub_invert_matching
test_thread_safe test_thread_safe
test_client_server test_client_server
test_setsockopt
test_sockopt_hwm test_sockopt_hwm
test_heartbeats test_heartbeats
test_poller test_poller
......
#include "testutil.hpp"
void test_setsockopt_tcp_recv_buffer()
{
int rc;
void *ctx = zmq_ctx_new();
void *socket = zmq_socket(ctx, ZMQ_PUSH);
int val = 0;
size_t placeholder = sizeof(val);
rc = zmq_getsockopt(socket, ZMQ_TCP_RECV_BUFFER, &val, &placeholder);
assert(rc == 0);
assert(val == 8192);
rc = zmq_setsockopt(socket, ZMQ_TCP_RECV_BUFFER, &val, sizeof(val));
assert(rc == 0);
assert(val == 8192);
rc = zmq_getsockopt(socket, ZMQ_TCP_RECV_BUFFER, &val, &placeholder);
assert(rc == 0);
assert(val == 8192);
val = 16384;
rc = zmq_setsockopt(socket, ZMQ_TCP_RECV_BUFFER, &val, sizeof(val));
assert(rc == 0);
assert(val == 16384);
rc = zmq_getsockopt(socket, ZMQ_TCP_RECV_BUFFER, &val, &placeholder);
assert(rc == 0);
assert(val == 16384);
zmq_close(socket);
zmq_ctx_term(ctx);
}
void test_setsockopt_tcp_send_buffer()
{
int rc;
void *ctx = zmq_ctx_new();
void *socket = zmq_socket(ctx, ZMQ_PUSH);
int val = 0;
size_t placeholder = sizeof(val);
rc = zmq_getsockopt(socket, ZMQ_TCP_SEND_BUFFER, &val, &placeholder);
assert(rc == 0);
assert(val == 8192);
rc = zmq_setsockopt(socket, ZMQ_TCP_SEND_BUFFER, &val, sizeof(val));
assert(rc == 0);
assert(val == 8192);
rc = zmq_getsockopt(socket, ZMQ_TCP_SEND_BUFFER, &val, &placeholder);
assert(rc == 0);
assert(val == 8192);
val = 16384;
rc = zmq_setsockopt(socket, ZMQ_TCP_SEND_BUFFER, &val, sizeof(val));
assert(rc == 0);
assert(val == 16384);
rc = zmq_getsockopt(socket, ZMQ_TCP_SEND_BUFFER, &val, &placeholder);
assert(rc == 0);
assert(val == 16384);
zmq_close(socket);
zmq_ctx_term(ctx);
}
int main()
{
test_setsockopt_tcp_recv_buffer();
test_setsockopt_tcp_send_buffer();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment