以XSUB、XPUB为例,浅谈ZeroMQ的传输桥接(转发代理)

一、需求场景

  • ØMQ用户的一个常见要求是:“我如何使用X技术连接我的ØMQ网络?”。其中X是某些其他网络或通信技术
  • 简单的答案是建立一个“桥梁”。桥是指一个小型应用程序,它用一种协议与一个套接字交流,并将其转换为另一个套接字的另一种协议。如果你喜欢,可以称之为一个协议解释器。ØMQ中一个常见的桥接问题是衔接两种传输协议或网络

二、演示案例

  • 现在我们编写一个小型代理,它位于一个发布者和一组订阅者之间,衔接两个网络:
    • 前端接口(SUB)面对着驻留了天气服务器的内部网络,而后端(PUB)面对着外部网络上的订阅者
    • 它在前端套接字上订阅气象服务,并在后端套接字上重新发布数据

  • 这个转发代理非常类似于早期代理的例子,但关键的部分在于,前端和后端套接字在两个不同的网络上。例如,我们可以留用这个模型将多播网络(pgm传输协议)连接到一个TCP发布者
  • 演示代码如下:下面是转发代理的代码,其中使用了zmq_proxy()接口来定义代理,非常简洁
// wuproxy.c
// 源码链接: https://github.com/dongyusheng/csdn-code/blob/master/ZeroMQ/wuproxy.c
#include <stdio.h>
#include <zmq.h>

int main()
{
    // 1.创建新的上下文
    void *context = zmq_ctx_new();

    // 2.前端套接字, 用于连接内部的天气服务器
    void *frontend = zmq_socket(context, ZMQ_XSUB);
    zmq_connect(frontend, "tcp://localhost:5556");

    // 3.后端套接字, 用来处理外部的订阅者的请求
    void *backend = zmq_socket(context, ZMQ_XPUB);
    zmq_bind(backend, "tcp://111.229.177.161:8100");

    // 4.持续运行代理
    zmq_proxy(frontend, backend, NULL);

    // 5.关闭套接字、清除上下文
    zmq_close(frontend);
    zmq_close(backend);
    zmq_ctx_destroy(context);

    return 0;
}
  • 编译运行如下
gcc -o wuproxy wuproxy.c -lzmq
  • 运行如下:
    • 上方的是发布者(wuserver.c),运行在内部,其绑定的地址是“tcp://*:5556”
    • 中间的是代理(就是上面的wuproxy.c),也运行在内网。其连接到发布者localhost:5556上,并绑定外网地址111.229.177.161:8100上(由于我们使用的是腾讯的云服务器,云服务器编写服务器程序绑定时只能使用0.0.0.0,因此其实际绑定的地址是0.0.0.0:8100)
    • 最下面的是订阅者(wuclient.c),运行在外网,其连接到代理111.229.177.161:8100上

附加:zmq_proxy()函数


  • 我是小董,V公众点击"笔记白嫖"解锁更多【ZeroMQ】资料内容。

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页