ZMQ Socket API

1. zmq_ctx_new(3)

Synopsis
void *zmq_ctx_new ();
Description

zmq_ctx_new() 函数创建了一个新的 ØMQ context。

thread safety

一个 ØMQ context 是线程安全的,可能在多个应用线程间共享,对于调用方而言不需要额外的锁。

Return value

如果成功,zmq_ctx_new()函数应当返回一个指向新创建的context的不透明handle。否则它将返回NULL,并设置errno的值。

Errors

这个函数未定义任何错误。

2. zmq_socket(3)

Synopsis
void *zmq_socket (void *context, int type);
Description

zmq_socket()函数使用指定的 context 将创建一个 ØMQ socket 并返回一个指向新创建socket的不透明 handle。类型参数指定套接字类型,它决定了在socket之上的通讯语义。
新创建的套接字的初始化状态是未绑定的,它与任何终端无关。为了建立一个消息流,一个socket必须首先使用zmq_connet()与至少一个终端建立连接,或者必须使用zmq_bind()创建一个终端来接收到来的连接。

较传统sockets的关键不同点

通常来说,传统的套接字提供面向连接的可靠字节流(SOCK_STREAM)或无连接的不可开数据报的同步接口。相较而言,ØMQ sockets 提供一个异步消息队列的抽象,依据使用的套接字类型有额外的队列语义。传统的套接字传输字节流或离散的数据报,而 ØMQ 套接字传输离散的消息。

ØMQ是异步的,这意味着物理连接的建立和离开,重新连接和有效交付的时间对用户来说是透明的,并且由ØMQ自己组织。此外,在peer无法接收消息的情况下,消息可能会被排队。

传统套接字仅允许严格意义上的one-to-one(two peers),many-to-one(many clinets, one server),或者在一些情况下的 one-to-many(multicast) 关系。除了ZMQ_PAIR,ØMQ 套接字可能使用zmq_connect()连接多个终端,同时,使用zmq_bind()接收多个终端到来的连接绑定到终端,因此允许many-to-many关系。

线程安全

ØMQ 有线程安全的套接字类型和非线程安全的套接字类型。应用不能在多线程中使用非线程安全的套接字类型,除非将套接字从一条线程迁移到另一条线程,并使用full fence内存屏障。

下述是线程安全的套接字:* ZMQ_CLIENT * ZMQ_SERVER * ZMQ_DISH * ZMQ_RADIO * ZMQ_SCATTER * ZMQ_GATHER

套接字类型

下节介绍ØMQ定义的套接字类型,按照通用的消息模式分类–由相关的套接字类型构建。

发布订阅模式
发布-订阅模式用于one-to-many的数据分发,以扇形发散的方式,从单个的发布者分发到所有的订阅者处。

ZMQ_PUB
ZMQ_PUB类型的套接字被发布者用于发布数据。消息以扇形发散的方式发送到所有的连接peers。zmq_recv(3)函数没有实现这个套接字的对应功能。

当 ZMQ_PUB 因为到达订阅者的高水位而进入静音状态。然后直到静音状态结束,任何将被发送到订阅者的消息都将被丢弃。

ZMQ_PUB特性
兼容的peer套接字 ZMQ_SUB, ZMQ_XSUB
方向 单向
发送/接收模式 仅发送
进入路由策略 N/A
外出路由策略 Fan out
静音状态行为 丢弃

ZMQ_SUB
ZMQ_SUB套接字类型,被一个订阅者用于订阅发布者分发的数据。起初ZMQ_SUB套接字没有订阅任何消息,使用 zmq_setsocketopt(3) 的 ZMQ_SUBSCRIBE 选项来指定要订阅哪些消息。对于ZMQ_SUB类型的套接字来说,zmq_send() 函数没有实现。

ZMQ_SUB 的特性总结
兼容的peer套接字 ZMQ_PUB, ZMQ_XPUB
方向 单向
发送/接收模式 仅接收
进入路由策略 Fair-queued
外出路由策略 N/A
Example

使用 zmq_stream 创建一个简单的http server

void *ctx = zmq_ctx_new ();
assert (ctx);
/* Create ZMQ_STREAM socket */
void *socket = zmq_socket (ctx, ZMQ_STREAM);
assert (socket);
int rc = zmq_bind (socket, "tcp://*:8080");
assert (rc == 0);
/* Data structure to hold the ZMQ_STREAM routing id */
uint8_t routing_id [256];
size_t routing_id_size = 256;
/* Data structure to hold the ZMQ_STREAM received data */
uint8_t raw [256];
size_t raw_size = 256;
while (1) {
   
 	/* Get HTTP request; routing id frame and then request */
 	routing_id_size = zmq_recv (socket, routing_id, 256, 0);
 	assert (routing_id_size > 0);
	do {
   
		raw_size = zmq_recv (socket, raw, 256, 0);
		assert (raw_size >= 0);
	} while (raw_size == 256);
	/* Prepares the response */
	char http_response [] =
	"HTTP/1.0 200 OK\r\n"
	"Content-Type: text/plain\r\n"
	"\r\n"
	"Hello, World!";
	/* Sends the routing id frame followed by the response */
	zmq_send (socket, routing_id, routing_id_size, ZMQ_SNDMORE);
	zmq_send (socket, http_response, strlen (http_response), 0);
	/* Closes the connection by sending the routing id frame followed by a zero response */
	zmq_send (socket
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值