ZeroMQ:21---模式之(傳輸橋接(轉發代理))

一、需求場景

  • Ø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上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章