一、需求場景
- Ø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上
- 代碼請參閱,記得使用時請修改綁定或連接的地址端口: