Hi Joe,

would you mind to use czmq? This hides all the details of using zeromq API and simplify developer's work a lot!
#include <czmq.h>

zsock_t *socket = zsock_stream_new (endpoint);

while (!zsys_interrupted) {
     zmsg_t *msg = zmsg_recv (socket);
    // ... process the msg
     zmsg_destroy (&msg);

zsock_destroy (&socket);

On Thu, Aug 2, 2018 at 8:45 AM, Joe Lin via zeromq-dev <zeromq-dev@lists.zeromq.org> 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?

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.

zeromq-dev mailing list

best regards
     Michal Vyskocil