ZeroMQ+Protobuf实例

2023-05-16

使用库版本
zeromq-4.0.3

 接收端代码

#include <zmq.h>
#include "stdio.h"

int main(int argc, char * argv[])
{
    void * pCtx = NULL;
    void * pSock = NULL;
    const char * pAddr = "tcp://*:7766";

    //创建context,zmq的socket 需要在context上进行创建 
    if((pCtx = zmq_ctx_new()) == NULL)
    {
        return 0;
    }
    //创建zmq socket ,socket目前有6中属性 ,这里使用dealer方式具体使用方式请参考zmq官方文档 
    if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
    {
        zmq_ctx_destroy(pCtx);
        return 0;
    }
    int iRcvTimeout = 5000;// millsecond
    //设置zmq的接收超时时间为5秒 
    if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < 0)
    {
        zmq_close(pSock);
        zmq_ctx_destroy(pCtx);
        return 0;
    }
    //绑定地址 tcp://*:7766 也就是使用tcp协议进行通信,使用网络端口 7766
    if(zmq_bind(pSock, pAddr) < 0)
    {
        zmq_close(pSock);
        zmq_ctx_destroy(pCtx);
        return 0;
    }
    printf("bind at : %s\n", pAddr);
    while(1)
    {
        char szMsg[1024] = {0};
        printf("waitting...\n");
        errno = 0;
        //循环等待接收到来的消息,当超过5秒没有接到消息时,zmq_recv函数返回错误信息
        if(zmq_recv(pSock, szMsg, sizeof(szMsg), 0) < 0)
        {
            printf("error = %s\n", zmq_strerror(errno));
            continue;
        }
        printf("received message : %s\n", szMsg);
    }

    return 0;
}

发送端代码

#include <zmq.h>
#include "stdio.h"

int main(int argc, char * argv[])
{
    void * pCtx = NULL;
    void * pSock = NULL;
    //使用tcp协议进行通信,需要连接的目标机器IP地址为192.168.1.2通信使用的网络端口 为7766 
    const char * pAddr = "tcp://192.168.1.2:7766";

    //创建context 
    if((pCtx = zmq_ctx_new()) == NULL)
    {
        return 0;
    }
    //创建socket 
    if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
    {
        zmq_ctx_destroy(pCtx);
        return 0;
    }
    int iSndTimeout = 5000;// millsecond
    //设置接收超时 
    if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iSndTimeout, sizeof(iSndTimeout)) < 0)
    {
        zmq_close(pSock);
        zmq_ctx_destroy(pCtx);
        return 0;
    }
    //连接目标IP192.168.1.2,端口7766 
    if(zmq_connect(pSock, pAddr) < 0)
    {
        zmq_close(pSock);
        zmq_ctx_destroy(pCtx);
        return 0;
    }
    //循环发送消息 
    while(1)
    {
        static int i = 0;
        char szMsg[1024] = {0};
        snprintf(szMsg, sizeof(szMsg), "hello world : %3d", i++);
        printf("Enter to send...\n");
        if(zmq_send(pSock, szMsg, sizeof(szMsg), 0) < 0)
        {
            fprintf(stderr, "send message faild\n");
            continue;
        }
        printf("send message : [%s] succeed\n", szMsg);
        getchar();
    }

    return 0;
}
编译
gcc -o recv recv.c -lzmq
gcc -o send send.c -lzmq

运行

export LD_LIBRARY_PATH=/usr/local/lib/

接收端

$ ./recv 
bind at : tcp://*:7766
waitting...
received message : hello world :   0
waitting...
received message : hello world :   1
waitting...
received message : hello world :   2
waitting...
received message : hello world :   3
waitting...
received message : hello world :   4
waitting...
received message : hello world :   5
waitting...

 

发送端

$ ./send 
Enter to send...
send message : [hello world :   0] succeed

Enter to send...
send message : [hello world :   1] succeed

Enter to send...
send message : [hello world :   2] succeed

Enter to send...
send message : [hello world :   3] succeed

Enter to send...
send message : [hello world :   4] succeed

Enter to send...
send message : [hello world :   5] succeed

 

UserInfo.proto,适⽤用于protobuf3的协议定义⽂文件,该协议包含两部分:

Part-1:Server/Client消息定义,⽤用于Client主动请求Server的协议内容;

Part-2:Publish/Subscribe消息定义,⽤用于Publisher主动发布数据给Subscriber的协议内容,其中每条消息对应的topic参考其注释;

syntax = "proto3";
package UserInfo.proto;
/* ----------Part-1 : Server/Client消息定义---------- */
/* 请求类型枚举 */
enum RequestType {
UNKNOWN_REQUEST_TYPE = 0;
MAKE_I_CALL = 1; // 拨打 I-CALL

}

/* ----------Part-2 :Publish/Subscribe消息定义---------- */
//topic:"user_id"
message UserID {
string user_id = 1;
}

 

代码⽣生成

$ protoc --cpp_out=./ UserInfo.proto # ⽣生成 C++ 代码

UserInfo.pb.h和UserInfo.pb.cc
$ protoc --java_out=./ UserInfo.proto # ⽣生成 Java 代码

 

其他资料

https://gitee.com/solym/ZeroMQ-Guide-Zh

https://github.com/booksbyus/zguide

ZMQ接口文档的官方网站 : http://api.zeromq.org/

ZMQ接口文档的百度网盘下载地址(英文):http://pan.baidu.com/s/1jGDqXfS

 

● zmq - 0MQ 轻量级消息传输内核

● zmq_bind - 绑定一个socket

● zmq_close - 关闭ZMQ socket

● zmq_connect - 由一个socket创建一个对外连接

● zmq_ctx_destroy - 销毁一个ZMQ环境上下文

● zmq_ctx_get - 得到环境上下文的属性

● zmq_ctx_new – 创建一个新的ZMQ 环境上下文

● zmq_ctx_set - 设置环境上下文属性

● zmq_ctx_shutdown - 停止一个ZMQ context

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

● zmq_ctx_term - 终结一个ZMQ环境上下文

● zmq_curve – 安全的认证方式和保密方式

● zmq_curve_keypair - 生成一个新的CURVE 密钥对

● zmq_disconnect - 断开一个socket的连接

● zmq_errno – 返回errno的值给调用此函数的线程

● zmq_init - 初始化ZMQ环境上下文 (已弃用)

● zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码 

● zmq_z85_encode – 使用Z85算法对一个二进制秘钥进行加密,输出可打印的文本

● zmq_version – 返回ZMQ链接库的版本

● zmq_unbind - 停止连接外来的请求

● zmq_plain - 明文认证

● zmq_null - 无安全和加密

● zmq_msg_more - 指出是不是还有更多的消息部分可以接收

● zmq_msg_init - 初始化一个空的ZMQ消息结构

● zmq_msg_init_data - 从一个指定的存储空间中初始化一个ZMQ消息对象的数据

● zmq_msg_init_size - 使用一个指定的空间大小初始化ZMQ消息对象

● zmq_msg_move - 将一个消息里面的内容移动到另一个消息里面

● zmq_msg_copy - 把一个消息的内容复制到另一个消息中

● zmq_msg_data - 返回消息内容的指针

● zmq_msg_get - 获取消息的性质

● zmq_msg_set - 设置消息的性质

● zmq_msg_size - 以字节为单位返回消息内容的大小

● zmq_msg_recv - 从一个socket中接受一个消息帧

● zmq_msg_close – 释放一个ZMQ消息

● zmq_msg_send – 从一个socket发送一个消息帧

● zmq_term - 终结ZMQ环境上下文(context)(已弃用)

● zmq_strerror - 获取ZMQ错误描述字符串

● zmq_poll - I/O多路技术

● zmq_tcp – 使用TCP协议的ØMQ网络单播协议

● zmq_recv – 从一个socket上接收一个消息帧

● zmq_send – 在一个socket上发送一个消息帧

● zmq_proxy – 开始ZMQ内置代理

● zmq_recvmsg – 从一个socket上接收一个消息帧 (已弃用)

● zmq_sendmsg – 从一个socket上发送一个消息帧 (已弃用)

● zmq_ipc – ZMQ本地进程间通信传输协议

● zmq_proxy_steerable – 以STOP/RESUME/TERMINATE控制方式开启内置的ZMQ代理

● zmq_inproc – ØMQ 本地进程内(线程间)传输方式

● zmq_pgm – ØMQ 使用PGM 进行可靠的多路传输

● zmq_send_const – 从一个socket上发送一个固定内存数据

● zmq_socket – 创建ZMQ套接字

● zmq_setsockopt –设置ZMQ socket的属性

● zmq_getsockopt – 获取ZMQ socket的属性

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZeroMQ+Protobuf实例 的相关文章

  • Protobuf安装步骤

    今天看Brpc开源代码的时候 看到了里面提到了google开源的protobuf的数据序列化和反序列工具 所以特地下了源码 试着看下一个简单的使用过程 1 protobuf的介绍 google protobuf是一个灵活的 高效的用于序列化
  • ZeroMQ - 多个发布者和监听器

    我刚刚开始了解并尝试 ZeroMQ 我不清楚如何在两个以上的参与者 发布者和订阅者 之间进行双向通信 以便每个组件都能够在 MQ 上读取和写入 这将允许创建事件驱动的架构 因为每个组件都可以侦听一个事件并回复另一个事件 有没有办法直接使用
  • 如何在ZeroMQ(C++)中使用XPUB和XSUB通过代理实现Pub-Sub网络?

    我是 Zeromq 的新手 最近我对zeromq的pub sub做了一些测试 我不知道如何在ZeroMQ中使用XPUB和XSUB来实现带有代理的Pub Sub网络 希望您的帮助 非常感谢 通过学习基础知识examples 对于代理 只需使用
  • Boost:反序列化通过 ZeroMQ 拉套接字传递的自定义 C++ 对象

    我在这里写的文字是我之前在另一个线程中打开的后续问题Boost 序列化 反序列化通过 ZeroMQ 拉套接字传递的自定义 C 对象 早期线程中的编译问题已通过使用文本存档类型而不是二进制存档解决 但现在我在反序列化时遇到运行时问题 为了您的
  • 如何使用 ZMQ 发送/接收通过 Protocol Buffers 序列化的二进制数据

    我需要在 ZMQ 套接字上发送一个对象 用 GPB 序列化 目前该代码有一个额外的副本 如何直接将序列化数组写入message ts data ABT CommunicationProtocol introPacket Fill the p
  • Ratchet PHP WAMP - React / ZeroMQ - 特定用户广播

    Note 这是not与这个问题 https stackoverflow com questions 17583903 how to get the connection object of a specific user它利用Message
  • pyzmq安装错误

    我在尝试导入时收到错误zmq Traceback most recent call last File BasicPub py line 1 in
  • 将消息从其他语言发送到 IPython 内核

    有人有从 Python 外部与 IPython 内核通信的经验吗 如果我尝试将消息从 Python 应用程序发送到 IPython 内核 我会使用zmq kernelmanager https github com ipython ipyt
  • 为没有 ZeroMQ 绑定的语言创建 IPython 的语言内核

    有some http andrew gibiansky com blog ipython ipython kernels 有趣的描述 https stackoverflow com questions 22782028 ipython la
  • Zeromq:如何在 C++ 中访问 tcp 消息

    我是 ZeroMQ 的新手 正在学习 echo 客户端 服务器模式 请求 回复 的 C hello world 示例 服务器看起来像 Hello World server in C Binds REP socket to tcp 5555
  • 为分布式系统构建数据收集和监控的中间件[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在寻找一个好的中间件来构建监控和维护系统的解决方案 我们面临的挑战是监控 收集数据并维护由多达
  • Python 多处理问题?

    我有一个包含 500 个输入文件的文件夹 所有文件的总大小约为 500 MB 我想写一个python执行以下操作的脚本 1 将所有输入文件加载到内存中 2 初始化一个空的python稍后将使用的列表 参见项目符号 4 3 启动 15 个不同
  • ipc:// 上的 ZeroMQ REQ/REP 和并发性

    我使用 REQ REP 0MQ ipc 套接字实现了一个 JSON RPC 服务器 我遇到了奇怪的行为 我怀疑这是由于 ipc 底层 unix 套接字不是真正的套接字 而是一个事实一根管子 根据文档 必须强制执行严格的 zmq send z
  • php-zmq 未显示在 phpinfo() 页面上

    我在 Windows 上使用 Wamp Server 并安装了 zmq 库 当我在控制台上编写 php info 时 我看到 zmq 显示为已安装 zmq ZMQ 扩展 gt 已启用 ZMQ 扩展版本 gt 1 1 2 libzmq 版本
  • 了解 Zeromq Java 绑定

    我正在研究 Zeromq 作为 Java 项目中的消息传递解决方案 但我发现有关 Java 绑定的说明有点难以遵循 http www zeromq org bindings java http www zeromq org bindings
  • ZeroMQ性能测试。准确的延迟是多少?

    我正在使用 zmq 跨进程传输消息 并且我想做一些性能测试来获取延迟和吞吐量 官方网站给出了指南讲述如何运行性能测试 http zeromq org results perf howto 例如 我尝试过 local lat tcp 1521
  • Zeromq.node安装错误Ubuntu 12.04:'node-gyp重建'

    我正在尝试安装ZeroMQ节点 https github com JustinTulloss zeromq node using npm install zmq 但是 我不断收到以下错误 任何帮助将非常感激 gyp ERR build er
  • clrzmq 在 Xamarin Studios/C# 应用程序中找不到 libzmq

    我在 Mac 上使用 Xamarin Studio clrzmq通过 NuGet 包含 libzmq dll 上的 clrzmq 引用 我的应用程序编译得很好 但是当我尝试运行它时 我得到了这个 Unhandled Exception Sy
  • 如何将扩展 PUB-SUB 模式中的发布者和订阅者与 C++ 中 ZeroMQ 中的中介同步?

    Extended PUB SUB topology https i stack imgur com GEgpx png 我在一个有 1 个中介的用例中有多个发布者和多个订阅者 在 ZeroMQ 指南中 我了解了如何使用额外的方法来同步 1
  • ZeroMQ,我们可以使用 inproc: 传输以及 pub/sub 消息传递模式吗

    设想 我们正在评估ZeroMQ 具体来说jeroMq 用于事件驱动机制 应用程序是分布式的 其中多个服务 发布者和订阅者都是服务 可以存在于同一个 jvm 中或不同的节点中 这取决于部署架构 观察 为了玩玩我创建了一个pub sub图案与i

随机推荐