名称

zmq_tcp - 使用 TCP 的 0MQ 单播传输协议

提要

TCP 是一种无处不在、可靠的单播传输协议。当使用 0MQ 通过网络连接分布式应用程序时,使用 TCP 传输协议很可能是您的首选。

地址

0MQ 的端点是一个字符串,由一个“传输协议”:// 后跟一个“地址”组成。“传输协议”指定了要使用的底层协议。“地址”指定了要连接的传输协议特定的地址。

对于 TCP 传输协议,传输协议是 tcp,而“地址”部分的含义定义如下。

为套接字分配本地地址

使用 'tcp' 传输协议通过 zmq_bind() 为套接字分配本地地址时,'endpoint' 应被解释为“接口”后跟冒号和要使用的 TCP 端口号。

“接口”可以通过以下任一方式指定

  • 通配符 *,表示所有可用接口。

  • 分配给该接口的主要 IPv4 或 IPv6 地址,以其数字表示形式。

  • 由操作系统定义的不可移植的接口名称。

TCP 端口号可以通过以下方式指定

  • 一个数值,在 POSIX 系统上通常大于 1024。

  • 通配符 *,表示系统分配的临时端口。

使用临时端口时,调用者应使用 ZMQ_LAST_ENDPOINT 套接字选项检索实际分配的端口。详细信息请参阅 zmq_getsockopt

从套接字解绑通配符地址

如果在 zmq_bind() 中使用了通配符 * 'endpoint',调用者应使用从 ZMQ_LAST_ENDPOINT 套接字选项获得的实际 'endpoint',通过 zmq_unbind() 从套接字中解绑此 'endpoint'。

连接套接字

使用 'tcp' 传输协议通过 zmq_connect() 将套接字连接到对等方地址时,'endpoint' 应被解释为“对等方地址”后跟冒号和要使用的 TCP 端口号。您可以选择指定一个 'source_endpoint' 作为您连接的源地址;tcp://'source_endpoint';'endpoint',详情请参阅上文的“接口”描述。

“对等方地址”可以通过以下任一方式指定

  • 对等方的 DNS 名称。

  • 对等方的 IPv4 或 IPv6 地址,以其数字表示形式。

注意:TCP 传输协议使用的 ZeroMQ 消息传输协议 (ZMTP) 的描述可在以下地址找到:https://rfc.zeromq.cn/spec:23

高水位标记 (HWM)

对于 TCP 传输协议,高水位标记 (HWM) 机制与操作系统级别的 TCP 套接字缓冲区协同工作。这些 TCP 缓冲区的大小会因操作系统和多种其他因素而异。此外,操作系统提供的 TCP 缓冲区会根据消息大小容纳不同数量的消息(与 ZMQ HWM 设置不同,TCP 套接字缓冲区是以字节而不是消息为单位衡量的)。

这可能会导致看似无法解释的行为:例如,您可能期望在使用 TCP 传输协议的套接字上将 ZMQ_SNDHWM 设置为 100,在接收方速度慢时会阻止发送第 101 条消息。在使用 TCP 传输协议时,这种情况极不可能发生,因为操作系统 TCP 缓冲区通常会提供足够的缓冲,允许您发送远不止 100 条消息。

当然,如果接收方速度慢,在 TCP ZMQ 套接字上发送最终会触发套接字的“静默状态”;只是不要依赖于精确的 HWM 值。

显然,接收高水位标记也适用同样的考虑(参见 ZMQ_RCVHWM)。

示例

为套接字分配本地地址
//  TCP port 5555 on all available interfaces
rc = zmq_bind(socket, "tcp://*:5555");
assert (rc == 0);
//  TCP port 5555 on the local loop-back interface on all platforms
rc = zmq_bind(socket, "tcp://127.0.0.1:5555");
assert (rc == 0);
//  TCP port 5555 on the first Ethernet network interface on Linux
rc = zmq_bind(socket, "tcp://eth0:5555");
assert (rc == 0);
连接套接字
//  Connecting using an IP address
rc = zmq_connect(socket, "tcp://192.168.1.1:5555");
assert (rc == 0);
//  Connecting using a DNS name
rc = zmq_connect(socket, "tcp://server1:5555");
assert (rc == 0);
//  Connecting using a DNS name and bind to eth1
rc = zmq_connect(socket, "tcp://eth1:0;server1:5555");
assert (rc == 0);
//  Connecting using a IP address and bind to an IP address
rc = zmq_connect(socket, "tcp://192.168.1.17:5555;192.168.1.1:5555");
assert (rc == 0);

另请参阅

作者

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