名称
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 时,这两个函数的操作方式完全相同。
当向代理函数提供类型为 REP 或 PAIR 的 control 套接字时,应用程序可以向代理发送命令。支持以下命令:
- 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/。