zeromq是一个轻量级的消息库。它扩展了标准的套接字接口,其特性与传统的消息中间件不同,zeromq提供异步消息队列、多消息传递模式、消息过滤(订阅)、无缝访问多个传输协议等的抽象。

  本系列API文章基于ZMQ4.1.7编写。

1、上下文

  在使用任何ZMQ的库函数之前,必须创建ZMQ上下文,并且,当你退出程序,也必须销毁上下文,和上下文相关的有这些函数:

  创建上下文:zmq_ctx_new(3)
  获取/设置上下文属性:zmq_ctx_set(3) zmq_ctx_get(3)
  销毁上下文:zmq_ctx_shutdown(3) zmq_ctx_term(3)

1.1 线程安全

  ØMQ上下文是线程安全的,可以根据需要在尽可能多的应用程序线程之间共享,而不需要调用者需要额外的锁定。

  除了在将套接字从一个线程迁移到另一个线程时发出完全内存障碍的情况之外,单个ØMQ套接字不是线程安全的。

  实际上,这意味着应用程序可以使用zmq_socket()在一个线程中创建套接字,然后将其作为线程初始化的一部分传递给新创建的线程,例如通过作为pthread_create()的参数传递的结构。

1.2 多个上下文

  多个上下文可能共存于一个应用程序中。

  因此,应用程序可以直接使用ØMQ,并且同时使用任何数量的附加库或组件,只要遵守上述关于线程安全的准则,它们本身就可以使用ØMQ。

2、消息

  ØMQ消息是在同一应用程序的应用程序或组件之间传递的一个独立的数据单元。ØMQ消息没有内部结构,从ØMQ本身来看,它们被认为是不透明的二进制数据。

  提供以下功能来处理消息:

  初始化消息:zmq_msg_init(3)zmq_msg_init_size(3)zmq_msg_init_data(3)
  发送和接收消息:zmq_msg_send(3)zmq_msg_recv(3)
  关闭消息:zmq_msg_close(3)
  访问消息内容:zmq_msg_data(3)zmq_msg_size(3)zmq_msg_more(3)
  使用消息属性:zmq_msg_gets(3)zmq_msg_get(3)zmq_msg_set(3)
  消息操作:zmq_msg_copy(3)zmq_msg_move(3)

3、套接字

  ØMQ套接字提供异步消息队列的抽象,具体取决于正在使用的套接字类型。 有关所提供的套接字类型,请参阅zmq_socket(3)。

  提供以下函数来处理套接字:

  创建一个套接字:zmq_socket(3)
  关闭一个套接字:zmq_close(3)
  操作socket选项:zmq_getsockopt(3)zmq_setsockopt(3)
  建立消息流:zmq_bind(3)zmq_connect(3)
  发送和接收消息:zmq_msg_send(3)zmq_msg_recv(3)zmq_send(3)zmq_recv(3)zmq_send_const(3)
  监视套接字事件:zmq_socket_monitor(3)

3.1、 输入/输出复用

  ØMQ为应用程序提供了一种机制,用于将输入/输出事件复用到包含ØMQ套接字和标准套接字的集合中。 该机制镜像标准的poll()系统调用,并在zmq_poll(3)中详细介绍。

4、消息传输

  ØMQ套接字可以使用多种不同的底层传输机制。 每种运输机制都适用于特定目的,并具有其自身的优点和缺点。

  提供以下传输机制:

  使用TCP的单播传输:zmq_tcp(7)
  使用PGM的可靠组播传输:zmq_pgm(7)
  本地进程间通信传输:zmq_ipc(7)
  本地进程内(线程间)通信传输:zmq_inproc(7)

5、代理

  ØMQ提供代理来创建扇出和扇入式拓扑。代理将前端套接字连接到后端套接字,并且不透明地切换两个套接字之间的所有消息。 代理可以选择性地捕获所有流量到第三个套接字。 要在应用程序线程中启动代理,请使用zmq_proxy(3)。

6、安全

  ØMQ套接字可以选择一种安全机制。 两个同伴必须使用相同的安全机制。

  为IPC和TCP连接提供以下安全机制:

  无安全性:zmq_null(7)
  使用用户名和密码进行纯文本身份验证:zmq_plain(7)
  椭圆曲线认证和加密:zmq_curve(7)
  以铠装文本格式生成CURVE密钥对:zmq_curve_keypair(3)
  将装甲钥匙转换为32字节的二进制密钥:zmq_z85_decode(3)
  将32字节二进制CURVE键转换为装甲文本字符串:zmq_z85_encode(3)

7、错误处理

  ØMQ库函数使用POSIX系统上的标准约定来处理错误。

  通常,这意味着一旦失败,一个ØMQ库函数将返回一个NULL值(如果返回一个指针)或一个负值(如果返回一个整数),并且实际的错误代码应该存储在errno变量中。

  提供zmq_errno()函数来协助处理这些情况; 有关详细信息,请参阅zmq_errno(3)。

  zmq_strerror()函数用于将ØMQ特定的错误代码转换为错误消息字符串; 有关详细信息,请参阅zmq_strerror(3)。

ZeroMQ API(一) 总序的更多相关文章

  1. ZeroMQ API(三) 消息

    1.初始化消息 1.1 zmq_msg_init(3) 1.1.1 名称 zmq_msg_init - 初始化空的ZMQ消息 1.1.2 概要 int zmq_msg_init(zmq_msg_t * ...

  2. ZeroMQ API(七) 安全

    1.无安全性:zmq_null(7) 1.1 名称 zmq_null - 没有安全性或机密性 1.2 概要 NULL机制由ZMTP 3.0规范定义:http://rfc.zeromq.org/spec ...

  3. ZeroMQ API(五) 传输模式

    1.使用TCP的单播传输:zmq_tcp(7) 1.1 名称 zmq_tcp - 使用TCP的ZMQ单播传输 1.2 概要 TCP是一种无处不在,可靠的单播传输.当通过具有ZMQ的网络连接分布式应用程 ...

  4. ZeroMQ API(四) 套接字

    1.创建一个套接字 1.1 zmq_socket(3) 1.1.1 名称 zmq_socket - 创建ZMQ套接字 1.1.2 概要 void * zmq_socket(void * context ...

  5. ZeroMQ API(二) 上下文

    1.创建上下文 1.1 zmq_ctx_new(3) 1.1.1 名称 zmq_ctx_new - 创建新的ZMQ上下文 1.1.2 概要 void * zmq_ctx_new(); 1.1.3 描述 ...

  6. ZeroMQ API(八) 异常&属性

    1.错误处理 1.1 zmq_errno() 1.1.1 名称 zmq_errno - 为调用线程检索errno的值 1.1.2 概要 int zmq_errno(void); 1.1.3 描述 zm ...

  7. ZeroMQ API(六) 代理

    1.zmq_proxy(3) 1.1 名称 zmq_proxy - 开始内置ZMQ代理 1.2 概要 int zmq_proxy(const void * frontend,const void * ...

  8. ZeroMQ接口函数之 :zmq - 0MQ 轻量级消息传输内核

    官方网址:http://api.zeromq.org/4-0:zmq zmq(7) 0MQ Manual - 0MQ/3.2.5 Name zmq – ØMQ 轻量级消息传输内核 Synopsis # ...

  9. ZeroMQ接口函数之 :zmq_bind - 绑定一个socket

    ZeroMQ 官方地址 : http://api.zeromq.org/4-0:zmq-bind zmq_bind(3) ZMQ Manual - ZMQ/3.2.5 Name zmq_bind -  ...

随机推荐

  1. hihocoder #1388 : Periodic Signal fft

    题目链接: https://hihocoder.com/problemset/problem/1388 Periodic Signal 时间限制:5000ms内存限制:256MB 问题描述 Profe ...

  2. Java 单生产者消费者问题

    package com.cwcec.test; class Resource { private int count = 0; private boolean flag = false; public ...

  3. 词频统计Web工程

    本次将原本控制台工程迁移到了web工程上.. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经典英 ...

  4. BZOJ5324 JXOI2018守卫(区间dp)

    对于每个区间[l,r],显然右端点r是必须放置守卫的.考虑其不能监视到的点,构成一段段区间.一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区 ...

  5. BeautifulSoup的find()和findAll()

    BeautifulSoup的提供了两个超级好用的方法(可能是你用bs方法中最常用的).借助这两个函数,你可以通过表现的不同属性轻松过滤HTML(XML)文件,查找需要的标签组或单个标签. 首先find ...

  6. Access数据库通过ODBC导出到Oracle的两个小问题ora-24801\Ora-01401

    问题描述:从access通过odbc导出到oracle出现  ora-24801  非法值 错误  与  Ora-01401 值过大的错误 问题分析:access里面的字段类型为“备注”,导入到ora ...

  7. 【转】vi编辑只读文档无法保存的解决办法

    vi编辑只读文档无法保存的解决办法 使用普通用户编辑nginx.conf 等配置文件: 保存的时 候会提示:没有Root Permission 可以用如下方法解决:保存时加上::w !sudo tee ...

  8. 【BZOJ4820】【SDOI2017】硬币游戏

    Description Solution 设当前走出了一个不匹配任何字符串的串\(S\). ​ 若在\(S\)后随机增添\(m\)个字符,单看这些字符而言,这\(m\)个字符匹配到每个玩家的字符串的概 ...

  9. 【bzoj3527】 Zjoi2014—力

    http://www.lydsy.com/JudgeOnline/problem.php?id=3527 (题目链接) 题意 $${F_i=\sum_{j<i} {\frac{q_iq_j}{( ...

  10. 20135239益西拉姆 Linux内核分析 进程的描述和进程的创建

    [益西拉姆 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] 第六周 进程的描述 ...