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
[email protected]
https://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to