名称

zmq_proxy_steerable - 具有控制流的内置 0MQ 代理

概要

int zmq_proxy_steerable (const void '*frontend', const void '*backend', const void '*capture', const void '*control');

说明

zmq_proxy_steerable() 函数是 zmq_proxy() 函数的一个变体。它接受第四个 control 套接字。当 control 套接字为 NULL 时,这两个函数的操作方式完全相同。

当向代理函数提供类型为 REPPAIRcontrol 套接字时,应用程序可以向代理发送命令。支持以下命令:

PAUSE

代理将停止在其端点之间传输消息。REP control 套接字将回复一个空消息。否则不回复。

RESUME

代理将恢复在其端点之间传输消息。REP control 套接字将回复一个空消息。否则不回复。

TERMINATE

代理函数将退出并返回 0。REP control 套接字将回复一个空消息。否则不回复。

STATISTICS

代理状态将保持不变,并回复一组通过代理发送的消息的简单汇总值,如下所述。Control 套接字必须支持发送。

STATISTICS 命令的多部分消息回复中有八个统计值,每个值的大小为 uint64_t。它们是:

  • frontend 套接字接收的消息数量

  • frontend 套接字接收的字节数量

  • frontend 套接字发送的消息数量

  • frontend 套接字发送的字节数量

  • backend 套接字接收的消息数量

  • backend 套接字接收的字节数量

  • backend 套接字发送的消息数量

  • backend 套接字发送的字节数量

消息总数分别计算多部分消息中的每个部分。

返回值

如果在其 control 套接字上收到 TERMINATE,zmq_proxy_steerable() 函数返回 0。否则,返回 -1,并且 errno 设置为 ETERM 或 EINTR(与任一指定套接字关联的 0MQ 上下文已终止),或 EFAULT(提供的 frontend 或 backend 无效)。

示例

创建一个函数来运行代理
// Create the frontend and backend sockets to be proxied
void *frontend = zmq_socket (context, ZMQ_ROUTER);
void *backend = zmq_socket (context, ZMQ_DEALER);

// Create the proxy control socket
void *control = zmq_socket (context, ZMQ_REP);

// Bind the sockets.
zmq_bind (frontend, "tcp://*:5555");
zmq_bind (backend, "tcp://*:5556");
zmq_bind (control, "tcp://*:5557");

zmq_proxy_steerable(frontend, backend, NULL, control);
在另一个线程/进程中控制代理的代码。
void *control = zmq_socket (context, ZMQ_REQ);
zmq_connect (control, "tcp://*:5557");

zmq_msg_t msg;

zmq_send (control, "PAUSE", 5, 0);
zmq_msg_recv (&msg, control, 0));

zmq_send (control, "RESUME", 6, 0);
zmq_msg_recv (&msg, control, 0));

zmq_send (control, "STATISTICS", 10, 0);
while (1) {
    zmq_msg_recv (&msg, control, 0));
    printf(" %lu", *(uint64_t *)zmq_msg_data (&msg));
    if (!zmq_msg_get (&msg, ZMQ_MORE))
        break;
}
printf("\n");

zmq_send (control, "TERMINATE", 9, 0);
zmq_msg_recv (&msg, control, 0));

zmq_close(frontend);
zmq_close(backend);
zmq_close(control);

另请参阅

作者

本页面由 0MQ 社区编写。要进行更改,请阅读 0MQ 贡献政策,网址为 https://zeromq.cn/how-to-contribute/