ZeroMQ接口函數之 :zmq_msg_recv - 從一個socket中接受一個消息幀


ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv

zmq_msg_recv(3)     ØMQ Manual - ØMQ/3.2.5

Name

zmq_msg_recv - 從一個socket中接受一個消息幀

Synopsis

int zmq_msg_recv (zmq_msg_t *msg, void *socket, int flags);

Description

zmq_msg_recv()函數和zmq_recvmsg(3)函數是完全相同的,但是zmq_recvmsg(3)函數將在以后的版本中被丟棄。zmq_msg_recv()函數和其它的函數更符合一些。

zmq_msg_recv()函數將會從socket參數指定的的socket中讀取消息幀,並存儲在msg參數指定的ZMQ消息結構間中。以前存儲在消息msg中的內容會被准確的釋放。如果此刻,在socekt參數指定的的socket上沒有消息可以接收,zmq_msg_recv()會進入阻塞狀態,直到其請求被滿足為止。flags參數是下列一些標志的組合。

  ZMQ_DONTWAIT

    指定本次操作以非阻塞模式進行。如果在指定的socket上沒有消息可以接收,zmq_msg_recv()函數將會執行失敗,並設置errno的值為EAGAIN。

  多部分消息(Multi-part messages)

    一個ZMQ消息是由1個或多個段組成的。每個消息段都是一個對立的zmq_msg_t消息結構。ZMQ確保對消息進行原子交付:每個socket或者接收整個消息,或者一個消息段也不接收。每個消息中的段數是不受限制的,除非內存不夠用了。

對於執行多分段消息的進程,每次在執行zmq_msg_recv()后需要檢測ZMQ_RCVMORE zmq_getsockopt(3)屬性,以確定是否還有剩余的消息段可以接收。

Return value

如果zmq_msg_recv() 函數執行成功,會以B為單位返回消息的大小。否則返回 -1,並且設置errno的值為下列指定的值。

Errors

  EAGAIN

    以非阻塞模式接收數據執行時當前消息隊列中沒有消息。

  ENOTSUP

    此socket的類型不支持zmq_msg_recv()函數。

  EFSM

    由於socket當前處於不可用狀態,zmq_msg_recv()函數無法對這個socket進行操作。這個錯誤的發成常常由於socket的類型正在幾種不同的狀態間轉變過程中,比如ZMQ_REP。請查看zmq_socket(3)函數的消息模式章節以得到更多信息。

  ETERM

    與socket相聯系的context被終結了。

  ENOTSOCK

    參數提供的socket不可用。

  EINTR

    在一個消息可以使用前,因為收到系統信號,這個操作被中斷了。

  EFAULT

    參數傳遞給函數的消息不可用。

Example

  從一個socket接收消息

1 /* Create an empty ØMQ message */
2 zmq_msg_t msg; 3 int rc = zmq_msg_init (&msg); 4 assert (rc == 0); 5 /* Block until a message is available to be received from socket */
6 rc = zmq_msg_recv (&msg, socket, 0); 7 assert (rc != -1); 8 /* Release message */ zmq_msg_close (&msg);

  接收一個由多段組成的消息

 1 int64_t more;  2 
 3 size_t more_size = sizeof more;  4 
 5 do {  6 
 7     /* Create an empty ØMQ message to hold the message part */
 8 
 9  zmq_msg_t part; 10 
11     int rc = zmq_msg_init (&part); 12 
13     assert (rc == 0); 14 
15     /* Block until a message is available to be received from socket */
16 
17     rc = zmq_msg_recv (&part, socket, 0); 18 
19     assert (rc != -1); 20 
21     /* Determine if more message parts are to follow */
22 
23     rc = zmq_getsockopt (socket, ZMQ_RCVMORE, &more, &more_size); 24 
25     assert (rc == 0); 26 
27 zmq_msg_close (&part); 28 
29 } while (more);

See also

zmq_recv(3) zmq_send(3) zmq_msg_send(3) zmq_getsockopt(3) zmq_socket(7) zmq(7)

Authors

This man page was written by Martin Sustrik <sustrik@250bpm.com>, Martin Lucina <martin@lucina.net>, and Pieter Hintjens <ph@imatix.com>.

Web site design and content is copyright (c) 2007-2012 iMatix Corporation. Contact us for professional support. Site content licensed under the Creative Commons Attribution-Share Alike 3.0 License. ØMQ is copyright (c) Copyright (c) 2007-2012 iMatix Corporation and Contributors. ØMQ is free software licensed under the LGPL. ØMQ, ZeroMQ, and 0MQ are trademarks of iMatix Corporation. Terms of Use — Privacy

Policy

 

更多 ZeroMQ API :http://www.cnblogs.com/fengbohello/p/4230135.html

 

翻譯:風波

mail : fengbohello@qq.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM