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