zmq_socket()

Name

zmq_socket : 创建0MQ socket

Synopsis

void *zmq_socket(void *context, int type)

描述

zmq_socket(): 在一个特定的context中创建一个0MQ socket,返回一个不透明的句柄到新创建的socket中。

type: 指定socket类型。

新创建的socket初试时时未绑定的,不和任何相关联。为了建立一个信息流,socket必须首先zmq_connect()其中一个终端,或是zmq_bind();


与传统socket的不同:

传统socket提供的同步接口,要么是面向连接的可靠的字节流(SOCK_STREAM),要么是无连接不可靠的数据包(SOCK_DGRAM).

0MQ socket 是异步的,物理连接的安装和卸载,重连和有效地转发等对用户来说都是透明的,时间由0MQ自己控制。 消息会排队,当一个peer不能有效接收时。


传统socket :严格的1-1(2个peer)、N-1(多个client,一个server)、1-N(多播)。

0MQ: ZMQ_PAIR是个特例。0MQ socket 可以连接到多个终端,使用zmq_connect();同时,可以结果多个终端的信息,使用zmq_bind().  N-N的模式


线程安全:

0MQ socket不是线程安全的。 Applications MUST NOT use a socket from multiple threads except after migrating a socket from one thread to another with a "full fence" memory barrier.

Socket类型

  1. Request-reply pattern:
    Summary of ZMQ_REQ characteristics
    Compatible peer socketsZMQ_REPZMQ_ROUTER
    DirectionBidirectional
    Send/receive patternSend, Receive, Send, Receive, …
    Outgoing routing strategyRound-robin
    Incoming routing strategyLast peer
    Action in mute stateBlock
    Summary of ZMQ_REP characteristics
    Compatible peer socketsZMQ_REQZMQ_DEALER
    DirectionBidirectional
    Send/receive patternReceive, Send, Receive, Send, …
    Incoming routing strategyFair-queued
    Outgoing routing strategyLast peer
    Action in mute stateDrop
    Summary of ZMQ_DEALER characteristics
    Compatible peer socketsZMQ_ROUTERZMQ_REPZMQ_DEALER
    DirectionBidirectional
    Send/receive patternUnrestricted
    Outgoing routing strategyRound-robin
    Incoming routing strategyFair-queued
    Action in mute stateBlock


    Summary of ZMQ_ROUTER characteristics
    Compatible peer socketsZMQ_DEALERZMQ_REQZMQ_ROUTER
    DirectionBidirectional
    Send/receive patternUnrestricted
    Outgoing routing strategySee text
    Incoming routing strategyFair-queued
    Action in mute stateDrop
    Summary of ZMQ_DEALER characteristics
    Compatible peer socketsZMQ_ROUTERZMQ_REPZMQ_DEALER
    DirectionBidirectional
    Send/receive patternUnrestricted
    Outgoing routing strategyRound-robin
    Incoming routing strategyFair-queued
    Action in mute stateBlock

  2. Publish-subscribe pattern : 1-N (1 publisher,multiple subscribers
  1. Summary of ZMQ_XSUB characteristics
    Compatible peer socketsZMQ_PUBZMQ_XPUB
    DirectionUnidirectional
    Send/receive patternReceive messages, send subscriptions
    Incoming routing strategyFair-queued
    Outgoing routing strategyN/A
    Action in mute stateDrop
    Summary of ZMQ_SUB characteristics
    Compatible peer socketsZMQ_PUBZMQ_XPUB
    DirectionUnidirectional
    Send/receive patternReceive only
    Incoming routing strategyFair-queued
    Outgoing routing strategyN/A
    Action in mute stateDrop
    Summary of ZMQ_PUB characteristics
    Compatible peer socketsZMQ_SUBZMQ_XSUB
    DirectionUnidirectional
    Send/receive patternSend only
    Incoming routing strategyN/A
    Outgoing routing strategyFan out
    Action in mute stateDrop
    Summary of ZMQ_XPUB characteristics
    Compatible peer socketsZMQ_SUBZMQ_XSUB
    DirectionUnidirectional
    Send/receive patternSend messages, receive subscriptions
    Incoming routing strategyN/A
    Outgoing routing strategyFan out
    Action in mute stateDrop
  2. pipeline pattern:ZMQ_PUSH、ZMQ_PULL
    Summary of ZMQ_PUSH characteristics
    Compatible peer socketsZMQ_PULL
    DirectionUnidirectional
    Send/receive patternSend only
    Incoming routing strategyN/A
    Outgoing routing strategyRound-robin
    Action in mute stateBlock

Summary of ZMQ_PULL characteristics
Compatible peer socketsZMQ_PUSH
DirectionUnidirectional
Send/receive patternReceive only
Incoming routing strategyFair-queued
Outgoing routing strategyN/A
Action in mute stateBlock

void g_pZmqCtx = zmq_ctx_new(); void pMsgSocket = zmq_socket(g_pZmqCtx, ZMQ_SUB); if (!pMsgSocket) { std::cout << “Failed to create message socket” << std::endl; return; } if (0 != zmq_connect(pMsgSocket, TEST_MSG_ADDR)) { std::cout << "Failed to connect the message socket! code = " << zmq_errno() << " reason = " << zmq_strerror(zmq_errno()) <<std::endl; } zmq_setsockopt(pMsgSocket, ZMQ_SUBSCRIBE, “”, 0); zmq_msg_t filter, frameHeader,imgData; zmq_msg_init(&filter); zmq_msg_init(&frameHeader); zmq_msg_init(&imgData); int nRecvLen = 0; while (true) { QApplication::processEvents(); nRecvLen = zmq_msg_recv(&filter, pMsgSocket, 0); if (nRecvLen < 0) { int err = zmq_errno(); printf(“Error: %s\n”, zmq_strerror(err)); std::cout << “Failed to receive filter” << std::endl; } else { nRecvLen = zmq_msg_recv(&frameHeader, pMsgSocket, 0); ((char)zmq_msg_data(&frameHeader))[nRecvLen] = ‘\0’; QJsonObject objData; QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson((char)zmq_msg_data(&frameHeader), &error); if (error.error != QJsonParseError::NoError) { qDebug() << “QJsonParseError” << error.errorString(); } objData = doc.object(); int nIndex = objData[“index”].toInt(); int nWidth = objData[“width”].toInt(); int nHeight = objData[“height”].toInt(); if (0 == std::string(static_cast<char*>(zmq_msg_data(&filter))).find(“RgbImg”)) { int nChannels = objData[“channels”].toInt(); nRecvLen = zmq_msg_recv(&imgData, pMsgSocket, 0); if (nRecvLen < 0) { std::cout << “Failed to receive message” << std::endl; } else { std::cout << "receive rgb data index : " << nIndex << std::endl; … … } } } } 优化这段代码
08-06
struct MotionData { string strFilter; std::vector<float>fPosition; uint32_t io_status; }; 2.3.1.2 Filter “motor” 2.3.1.3 Motor data name Type option desc io_status uint32_t required io status position vector<float> required frame width #define TEST_MOT_ADDR "tcp://127.0.0.1:9999" std::vector<double> result; motionData: void *g_pZmqCtx = zmq_ctx_new(); void *pMotSocket = zmq_socket(g_pZmqCtx, ZMQ_SUB); if (!pMotSocket) { std::cout << "Failed to create motor socket" << std::endl; return; } if (0 != zmq_connect(pMotSocket, TEST_ MOT _ADDR)) { std::cout << "Failed to connect the motor socket! code = " << zmq_errno() << " reason = " << zmq_strerror(zmq_errno()) <<std::endl; } zmq_setsockopt(pMotSocket, ZMQ_SUBSCRIBE, "", 0); zmq_msg_t filter,motData; zmq_msg_init(&filter); zmq_msg_init(&motData); int nRecvLen = 0; while (true) { QApplication::processEvents(); nRecvLen = zmq_msg_recv(&filter, pMotSocket, 0); if (nRecvLen < 0) { int err = zmq_errno(); printf("Error: %s\n", zmq_strerror(err)); std::cout << "Failed to receive filter" << std::endl; } else { nRecvLen = zmq_msg_recv(&motData, pMotSocket, 0); ((char*)zmq_msg_data(&motData))[nRecvLen] = '\0'; QJsonObject objData; QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson((char*)zmq_msg_data(&motData), &error); if (error.error != QJsonParseError::NoError) { qDebug() << "QJsonParseError" << error.errorString(); } objData = doc.object(); int io_status= objData["io_status "].toInt(); QJsonArray arr = obj.value("position").toArray(); for (const QJsonValue& val : arr) { result.push_back(val.toDouble()); } } } release: zmq_msg_close(&filter); 优化这段代码,将ZMQ订阅和解析消息封装在一个Qt的函数中
最新发布
08-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值