名称
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/。