[zeromq-dev] Need advice on ZMQ_STREAM socket, zmq_recv truncating data
Luca Boccassi
luca.boccassi at gmail.com
Thu Aug 2 12:12:33 CEST 2018
On Wed, 2018-08-01 at 23:45 -0700, Joe Lin via zeromq-dev wrote:
> I’m using ZMQ_STREAM socket talking to a TCP server. A simplified
> workflow is that the server will stream large amount of data upon
> client connection. The stream is composed of long sequence of various
> sized chunks.
>
> The client code that reads the stream (omit the error checking):
>
> char buf[BUF_SIZE];
> int64_t more;
> size_t more_size = sizeof(more);
>
> while (true) {
> // first read the socket id
> int nbytes = zmq_recv(client_socket, buf, BUF_SIZE, 0);
> more = 1;
>
> // read the data
> while ( more ) {
> // read the data chunk, but data get truncated from time to time
> ??
> nbytes = zmq_recv(client_socket, buf, BUF_SIZE, 0);
>
> //… do something with the received data in the buffer
>
> // more always return 0 ?? The second while loop is of no use
> zmq_getsockopt(client_socket, ZMQ_RCVMORE, &more, &more_size)
> }
> }
>
> I have two questions. First is that I find the data that I received
> from zmq_recv can get truncated. I know this is the intend behavior
> of zmq_recv. But I cannot think of a good way to avoid this unless I
> allocate a very large buffer to begin with. What is a good practice
> for this problem?
zmq_recv, given it takes a limited size buffer from the application,
can't do much but truncate.
Use zmq_recv_msg which will fill the message with everything that is
received.
> Second is that I found that zmq_getsockop of ZMQ_RCVMORE always
> return more=0. Why is that? I wonder how zmq_recv buffers data
> internally for ZMQ_STREAM socket. I would expect when dealing with a
> TCP stream, zmq_recv should fill the supplied buffer as much as
> possible (as opposed to truncating) and if there are still some more
> data to be read then zmq_getsockop of ZMQ_RCVMORE would return
> more=1.
>
> Thanks for any help.
Read the zmq_socket manpage for details on what the multipart is used
for with the stream socket.
--
Kind regards,
Luca Boccassi
More information about the zeromq-dev
mailing list