ZeroMQ:zmq_recv()v / s zmq_msg_recv()调用之间有什么区别?

时间:2017-05-15 19:33:43

标签: zeromq

除了返回的结构之外,zmq_recvzmq_msg_recv之间是否存在差异?哪一个应该与ZMQ_PAIR套接字一起使用?

这个问题适用于ZeroMQ版本4.2.1。

1 个答案:

答案 0 :(得分:2)

更容易的部分: ZMQ_PAIR &所有其他原型都可以同时使用

分离原则有助于所有现有的高级可扩展形式通信模式({ PAIR | PULL | REQ | REP | XREP | XREQ | SUB | ... })忽略有关程序员使用的服务的详细信息,以及#34;并将它们视为一组受支持的外部用例。

这意味着可以使用以下两者之一:只是简单buf [] 配备aRetCODE = zmq_recv(...);或致电aRetCODE = zmq_msg_recv(...),其中稍微复杂一点,预先准备好的zmq_msg_t 对象应该做好充分准备。传递到内部处理。

如果在后一个用例中没有做到这一切,那么可以回复错误标记( aRetCODE == -1 )并在 errno == EFAULT <中设置详细信息/ strong> - 这是错误代码的一个实例,解释如下:

  

<强> EFAULT
      传递给该函数的消息无效。

因此两个调用都具有相同的返回值逻辑。

区别在于呼号 - 传递的参数

int zmq_recv (  void  *socket,           // yes, The Socket
                void  *buf,              //        a Buffer[] - byREF-> A STORAGE
                size_t len,              //        a Buffer length
                int    flags             // ZMQ details { ZMQ_NOBLOCK | ... }
                );

更简单的一个是直截了当的,几乎是不言自明的。

如上所述,另一个需要更多关注:

zmq_msg_t aMsgSTRUCT;                        // first: create aMsgSTRUCT
int       rc =  zmq_msg_init(  &aMsgSTRUCT );// next:  try intitialise it ( internality )
  assert (rc == 0);                          // test:  if things went well ( use this style, even when it has no error-code associated here, with zmq_msg_init() )
          rc =  zmq_msg_recv(  &aMsgSTRUCT, aSocket, ZMQ_NOBLOCK );
  assert (rc != -1);                         // test:  if things went well
...                                          // process: rc-bytes in aMsgSTRUCT
..                                           //
.                                            //
/* ALWAYS: */   zmq_msg_close( &aMsgSTRUCT );// finally: control dispose off
/* Release EACH message,
   these are
   not re-usable and
   require ZeroMQ internalities
   to take due care to release
   all their allocated resources
   */