ZeroMQ介面函式之 :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 <[email protected]>, Martin Lucina <[email protected]>, and Pieter Hintjens <[email protected]>.
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
翻譯:風波
mail : [email protected]