1. 程式人生 > >ZeroMQ介面函式之 :zmq_msg_recv

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]