ZeroMQ接口函数之 :zmq_socket_monitor - 注册一个监控回调函数

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

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

Name

zmq_socket_monitor - 注册一个监控回调函数

Synopsis

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

Description

zmq_socket_monitor() 函数会产生一个PAIR类型的socket,用来把socket状态改变(事件)通过inproc://传输方式广播到制定的终结点(endpoint)上。

消息包括两个帧,第一部分包含着事件ID和与其相关联的值。第二帧以字符串方式保存收到影响的终结点。

第一帧的组织方式是:16 bit的事件ID和32 bit的事件值。

事件ID和19:23值是按照本地的字节序排序的(即这个运行着的进程所在的机器)。在这两部分之间没有其它的数据。

事件值必须根据根据当前的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 API :http://www.cnblogs.com/fengbohello/p/4230135.html

翻译:风波

mail : [email protected]

时间: 2024-10-09 21:12:57

ZeroMQ接口函数之 :zmq_socket_monitor - 注册一个监控回调函数的相关文章

Entity Framework 6 Recipes 2nd Edition(11-4)译 -&gt; 在”模型定义”函数里调用另一个”模型定义”函数

11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11-4所示: Figure 11-4. A model representing the associate types in a company together with the reporting association 在我们的虚拟的公司里, , team members被一个team lea

272 函数的理解和使用:回调函数,匿名函数自调用IIFE,**函数中的this**

什么是函数? 用来实现特定功能的, n条语句的封装体 只有函数类型的数据是可以执行的, 其它的都不可以 为什么要用函数? 提高复用性 便于阅读交流 函数也是对象 instanceof Object===true 函数有属性: prototype 函数有方法: call()/apply() 可以添加新的属性/方法 函数的3种不同角色 一般函数 : 直接调用 构造函数 : 通过new调用 对象 : 通过.调用内部的属性/方法 函数中的this 显式指定谁: obj.xxx() 通过call/appl

OpenGL的GLUT注册回调函数[转]

OpenGL的注册回调函数 void glutDisplayFunc(void (*func)(void) ); 为当前窗口设置显示回调函数 void glutOverlayDisplayFunc(void (*func)(void) ); 注册当前窗口的重叠层的显示回调函数 void glutReshapeFunc(void (*Func)(int width, int height) ); 指定当窗口的大小改变时调用的函数 void glutKeyboardFunc(void (*func)

Java回调函数详解

为了了解什么是回调函数,在网上查阅了如下资料,整理如下: 资料一: 首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程

回调函数、Java接口回调 总结

回调函数 谈到回调,我们得先从回调函数说起,什么叫回调函数呢? 回调函数是什么?    百度百科的解释:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应.    接着,我们从下图简单说明一下回调函数.    已知图形上面三种模块,此时标号2能称为回调函数吗? 答案:不能,只有当标号2函

一个简单的java回调函数的实现

回调函数 回调函数涉及的3个函数 登记回调函数 回调函数 响应回调函数 简单的解释 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件.回答完毕.来自知乎点击打开链接 代码的实现 首先有一个接口 interface CallB

封装一个Ajax工具函数

/*封装一个ajax工具函数*/ window.$ = {}; /*通过$定义一个ajax函数*/ /* * 1. type   string   请求的方式  默认是get * 2. url    string   请求地址  接口地址 * 3. async  boolean  默认的是true * 4. data   object   {}请求数据 * * 5.success function  成功回调函数 * 6.error   function  失败的回调函数 * */ $.ajax

Javascript-回调函数浅谈

回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 中文名 回调函数 外文名 Callback Functions 意思 通过函数指针调用的函数 作用 对特定的事件或条件进行响应 机制 听语音 ⑴定义一个回调函数: ⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者

C++ 回调函数的定义与用法

一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢? 使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数. 而 那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作.至于如何定义回调函数,跟具体使用的 A