ZeroMQ接口函數之 :zmq_socket_monitor - 註冊一個監控回調函數

ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq-socket-monitorhtml

zmq_socket_monitor(3)       ØMQ Manual - ØMQ/4.1.0api

Name異步

zmq_socket_monitor - 註冊一個監控回調函數socket

Synopsistcp

int zmq_socket_monitor (void *socket, char * *addr, int events);

Description函數

zmq_socket_monitor() 函數會產生一個PAIR類型的socket,用來把socket狀態改變(事件)經過inproc://傳輸方式廣播到制定的終結點(endpoint)上。spa

消息包括兩個幀,第一部分包含着事件ID和與其相關聯的值。第二幀以字符串方式保存收到影響的終結點。翻譯

第一幀的組織方式是:16 bit的事件ID和32 bit的事件值。code

事件ID和19:23值是按照本地的字節序排序的(即這個運行着的進程所在的機器)。在這兩部分之間沒有其它的數據。htm

事件值必須根據根據當前的context和事件ID進行解析。更多細節請查看下面可支持的事件。

只有方向肯定的傳輸方式(tcp、ipc)才能支持此初始行爲。

支持的事件

ZMQ_EVENT_CONNECTED:連接已創建

  當和遠程的另外一端的鏈接創建好的時候,ZMQ_EVENT_CONNECTED事件會被觸發。同步和異步事件都會發生觸發此事件。事件值是新鏈接的socket的FD。

 

ZMQ_EVENT_CONNECT_DELAYED:同步鏈接失敗,仍在進行重試

  當一個請求當即鏈接的嘗試被延遲而且仍然在嘗試的時候,此事件被觸發。事件值沒有意義。

 

ZMQ_EVENT_CONNECT_RETRIED:嘗試異步鏈接/重連

  當一個鏈接嘗試被重連計時器捕獲後此事件被觸發。重連間隔根據全部的嘗試狀況進行計算。事件值是重連間隔。

 

ZMQ_EVENT_LISTENING:socket已經綁定了某個地址,準備好接受鏈接請求

  當一個socket成功的綁定在一個端口上的時候此事件被觸發。事件值是新綁定的socket的FD。

 

ZMQ_EVENT_BIND_FAILED:socket沒法綁定在這個地址上

  當一個socket沒法綁定在給定的端口上時此事件被觸發。事件值是綁定函數修改後的errno值。

 

ZMQ_EVENT_ACCEPTED:鏈接請求被接受

  一個從遠端到來的鏈接被一個綁定了地址的socket接受並創建了鏈接是會觸發此事件。事件值是被接受socket的FD。

 

ZMQ_EVENT_ACCEPT_FAILED:沒法接受客戶端的鏈接請求

  當一個鏈接請求試圖鏈接另外一個socket失敗的時候會觸發此事件。事件值是accept設置的errno值。

 

ZMQ_EVENT_CLOSED:鏈接關閉

  當一個鏈接的底層描述符被關閉是會觸發此事件。事件值是被關閉的socket的FD。此時這個FD已經被關閉了。

 

ZMQ_EVENT_CLOSE_FAILED:鏈接沒法被關閉

  當一個描述符沒法被釋放回OS的時候會觸發此事件。注意:只對IPC socket有效。事件值是釋放失敗時設置的errno值。

 

ZMQ_EVENT_DISCONNECTED:會話被破壞

  當流引擎(尤爲是TCP、IPC)出現了崩潰的/被破壞的會話時,此事件被觸發。事件值是socket的FD。

Return value

當函數zmq_socket_monitor() 執行成功時,返回0或者更大值。不然返回 -1,而且設置errno爲下列指定值。

Errors

  ETERM

    與被指定的socket關聯的ZMQ context 被終結了。

  EPROTONOSUPPORT

    沒法支持被請求的傳輸協議。監視socket必需要使用inproc://方式進行傳輸。

  EINVAL

    提供的地址節點不能用。

Example

  監視一個REP socket的鏈接狀態

 1 #include <stdio.h>
 2 #include <zmq.h>
 3 #include <pthread.h>
 4 #include <string.h>
 5 #include <assert.h>
 6 
 7 static int read_msg(void* s, zmq_event_t* event, char* ep)  8 {  9     int rc ; 10     zmq_msg_t msg1;  // binary part
11     zmq_msg_init (&msg1); 12     zmq_msg_t msg2;  // address part
13     zmq_msg_init (&msg2); 14     rc = zmq_msg_recv (&msg1, s, 0); 15     if (rc == -1 && zmq_errno() == ETERM) 16         return 1 ; 17     assert (rc != -1); 18     assert (zmq_msg_more(&msg1) != 0); 19     rc = zmq_msg_recv (&msg2, s, 0); 20     if (rc == -1 && zmq_errno() == ETERM) 21         return 1; 22     assert (rc != -1); 23     assert (zmq_msg_more(&msg2) == 0); 24     // copy binary data to event struct
25     const char* data = (char*)zmq_msg_data(&msg1); 26     memcpy(&(event->event), data, sizeof(event->event)); 27     memcpy(&(event->value), data+sizeof(event->event),       sizeof(event->value)); 28     // copy address part
29     const size_t len = zmq_msg_size(&msg2) ; 30     ep = memcpy(ep, zmq_msg_data(&msg2), len); 31     *(ep + len) = 0 ; 32     return 0 ; 33 } 34 
35 // REP socket monitor thread
36 static void *rep_socket_monitor (void *ctx) 37 { 38     zmq_event_t event; 39     static char addr[1025] ; 40     int rc; 41     printf("starting monitor...\n"); 42     void *s = zmq_socket (ctx, ZMQ_PAIR); 43  assert (s); 44     rc = zmq_connect (s, "inproc://monitor.rep"); 45     assert (rc == 0); 46     while (!read_msg(s, &event, addr)) { 47         switch (event.event) { 48         case ZMQ_EVENT_LISTENING: 49             printf ("listening socket descriptor %d\n", event.value); 50             printf ("listening socket address %s\n", addr); 51             break; 52         case ZMQ_EVENT_ACCEPTED: 53             printf ("accepted socket descriptor %d\n", event.value); 54             printf ("accepted socket address %s\n", addr); 55             break; 56         case ZMQ_EVENT_CLOSE_FAILED: 57             printf ("socket close failure error code %d\n", event.value); 58             printf ("socket address %s\n", addr); 59             break; 60         case ZMQ_EVENT_CLOSED: 61             printf ("closed socket descriptor %d\n", event.value); 62             printf ("closed socket address %s\n", addr); 63             break; 64         case ZMQ_EVENT_DISCONNECTED: 65             printf ("disconnected socket descriptor %d\n", event.value); 66             printf ("disconnected socket address %s\n", addr); 67             break; 68  } 69  } 70  zmq_close (s); 71     return NULL; 72 } 73 
74 int main() 75 { 76     const char* addr = "tcp://127.0.0.1:6666" ; 77  pthread_t thread ; 78     // Create the infrastructure
79     void *ctx = zmq_init (1); 80  assert (ctx); 81     // REP socket
82     void* rep = zmq_socket (ctx, ZMQ_REP); 83  assert (rep); 84     // REP socket monitor, all events
85     int rc = zmq_socket_monitor (rep, "inproc://monitor.rep", ZMQ_EVENT_ALL); 86     assert (rc == 0); 87     rc = pthread_create (&thread, NULL, rep_socket_monitor, ctx); 88     assert (rc == 0); 89     rc = zmq_bind (rep, addr); 90     assert (rc == 0); 91     // Allow some time for event detection
92     zmq_sleep (1); 93     // Close the REP socket
94     rc = zmq_close (rep); 95     assert (rc == 0); 96  zmq_term (ctx); 97     return 0 ; 98 }

See also

zmq(7)

Authors

This page was written by the ØMQ community. To make a change please read the ØMQ Contribution

Policy at http://www.zeromq.org/docs:contributing.

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 APIhttp://www.cnblogs.com/fengbohello/p/4230135.html

 

翻譯:風波

mail : fengbohello@qq.com

相關文章
相關標籤/搜索