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的连接状态

#include <stdio.h>
#include <zmq.h>
#include <pthread.h>
#include <string.h>
#include <assert.h>static int read_msg(void* s, zmq_event_t* event, char* ep)
{int rc ;zmq_msg_t msg1;  // binary partzmq_msg_init (&msg1);zmq_msg_t msg2;  //  address partzmq_msg_init (&msg2);rc = zmq_msg_recv (&msg1, s, 0);if (rc == -1 && zmq_errno() == ETERM)return 1 ;assert (rc != -1);assert (zmq_msg_more(&msg1) != 0);rc = zmq_msg_recv (&msg2, s, 0);if (rc == -1 && zmq_errno() == ETERM)return 1;assert (rc != -1);assert (zmq_msg_more(&msg2) == 0);// copy binary data to event structconst char* data = (char*)zmq_msg_data(&msg1);memcpy(&(event->event), data, sizeof(event->event));memcpy(&(event->value), data+sizeof(event->event),       sizeof(event->value));// copy address partconst size_t len = zmq_msg_size(&msg2) ;ep = memcpy(ep, zmq_msg_data(&msg2), len);*(ep + len) = 0 ;return 0 ;
}// REP socket monitor thread
static void *rep_socket_monitor (void *ctx)
{zmq_event_t event;static char addr[1025] ;int rc;printf("starting monitor...\n");void *s = zmq_socket (ctx, ZMQ_PAIR);assert (s);rc = zmq_connect (s, "inproc://monitor.rep");assert (rc == 0);while (!read_msg(s, &event, addr)) {switch (event.event) {case ZMQ_EVENT_LISTENING:printf ("listening socket descriptor %d\n", event.value);printf ("listening socket address %s\n", addr);break;case ZMQ_EVENT_ACCEPTED:printf ("accepted socket descriptor %d\n", event.value);printf ("accepted socket address %s\n", addr);break;case ZMQ_EVENT_CLOSE_FAILED:printf ("socket close failure error code %d\n", event.value);printf ("socket address %s\n", addr);break;case ZMQ_EVENT_CLOSED:printf ("closed socket descriptor %d\n", event.value);printf ("closed socket address %s\n", addr);break;case ZMQ_EVENT_DISCONNECTED:printf ("disconnected socket descriptor %d\n", event.value);printf ("disconnected socket address %s\n", addr);break;}}zmq_close (s);return NULL;
}int main()
{const char* addr = "tcp://127.0.0.1:6666" ;pthread_t thread ;//  Create the infrastructurevoid *ctx = zmq_init (1);assert (ctx);// REP socketvoid* rep = zmq_socket (ctx, ZMQ_REP);assert (rep);// REP socket monitor, all eventsint rc = zmq_socket_monitor (rep, "inproc://monitor.rep", ZMQ_EVENT_ALL);assert (rc == 0);rc = pthread_create (&thread, NULL, rep_socket_monitor, ctx);assert (rc == 0);rc = zmq_bind (rep, addr);assert (rc == 0);// Allow some time for event detectionzmq_sleep (1);// Close the REP socketrc = zmq_close (rep);assert (rc == 0);zmq_term (ctx);return 0 ;
}

zmq 接口函数之 :zmq_socket_monitor - 注册一个监控回调函数相关推荐

  1. python调用子类函数_如何从一个子类调用函数到另一个子类

    有很多方法可以实现这一点. 这里有一个:class Acct: def __init__(self, deposit): self.balance = deposit # Try to avoid s ...

  2. 如何理解android的函数,通过Android源码理解回调函数

    概述 我们先看一下维基百科对回调函数的定义: 在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代 ...

  3. vue 执行函数this_在vue中使用回调函数,this调用无效的解决

    let self = this //使用新变量替换this,以免this无效 //updatestudentinfotoserver是一个将本身部分数据异步上传的接口,接收三个参数,其中第一个是数据, ...

  4. ajax 成功回调函数,jQuery的阿贾克斯成功回调函数定义jQuery的阿贾克斯成功回调函数定义(jQuery ajax...

    我想使用jQuery的ajax从服务器获取数据. 我希望把成功的回调函数定义外面.ajax()块像下面这样. 所以,我需要声明变量dataFromServer像下面这样我就能从成功回调使用返回的数据? ...

  5. python中func函数用法_python之4类回调函数的使用方法

    原标题:python之4类回调函数的使用方法 将函数作为参数传递给另一个函数,一共分为4种情况: 将普通函数传递给普通函数 将普通函数传递给类成员函数 将类成员函数传递给普通函数 将类成员函数传递给类 ...

  6. mfc formview中的关闭视图函数_VC|API消息处理(回调函数+分支语句)与MFC中的消息映射函数...

    Windows程序不同于控制台程序,因为输入输出不再是scanf和printf那么简单了,而是通过窗口(包括对话框和控件)作为输入.输出的界面以及键盘.鼠标的各类输入事件. 用户在操作系统中的任何操作 ...

  7. js中回调函数的理解 举例说明js回调函数

    初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is passed as an arg ...

  8. javascript函数进阶详细内容 函数闭包 箭头函数 call bind apply用法 偏函数 回调函数

    JS函数进阶 这次的内容我会给大家详细介绍函数方面的内容 1.箭头函数:ES6新增的定义函数的方式,箭头函数是用来简化函数定义语法的. - 箭头函数的语法: ()=>{} ()里面写形式参数,{ ...

  9. C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数

    C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...

最新文章

  1. 旷视MegEngine网络搭建
  2. java_ant详解(转载)
  3. 第 4 章 Hypertable
  4. mac搭建php审计环境,[php审计实战篇]Simple-Log v1.6 安装逻辑问题
  5. qt用ODBC连接excel
  6. Cookie和Session的作用和工作原理
  7. JS之onsubmit事件与组织事件外延
  8. 猫和老鼠 蓝桥杯/手速/暴力练习赛(暴力搜索)
  9. 微信怎么at所有人_微信分付怎么开通,入口在这里,简单几步教你快速开通
  10. vue提交mutation_为什么Vuex中必须要通过commit提交mutation?
  11. Linux系统编程二:字符设备控制之点亮LED灯、控制蜂鸣器
  12. 用jQuery实现.net 2.0 treeview客户端无刷新操作的实例
  13. 【SQL学习+练习篇】基础训练,适用于初学者(一)
  14. cass简码大全_cass 简码识别
  15. 32位MD5加密 可用来微信加密
  16. acg-faka--功能丰富的发卡二次元商城源码
  17. Python中的文本替换
  18. 计算机老师 杂事多,有人说,老师忙,都忙在了教学之外的杂事上。你怎么看?...
  19. LoadRunner之并发用户数与迭代关系---并发数与迭代的区别
  20. java 有五个学生 每个学生有3门课_1、有五个学生,每个学生有3门课(语文、数学、英语)的成绩, 写一...

热门文章

  1. PATH和path,傻傻分不清
  2. 入门级图论算法:洪水填充算法
  3. P5704 【深基2.例6】字母转换(python实现)
  4. 1.3 编程基础之算术表达式与顺序执行(20题)
  5. 1168:大整数加法--2022.01.22 AC
  6. php导出csv文件,可导出前导0实例
  7. 【python基础】window下python安装及配置环境变量的方法教程
  8. 移动端点击拉起输入_没广告、无捆绑、真清流!讯飞输入法PC版评测:跨屏语音动口不动手...
  9. Java笔记-Spring Boot使用外部Tomcat及解决Tomcat乱码
  10. QML笔记-使用Row的时候要注意的地方(一定要指明高度和宽度)