ZeroMQ文档白嫖:一文述完ZeroMQ的套接字选项

一、设置套接字选项(zmq_setsockopt)

int zmq_setsockopt(void *socket, int option_name, const void *option_value, size_t option_len);
  • API参考文档参阅:http://api.zeromq.org/master:zmq-setsockopt
  • 功能:设置套接字选项。
  • 参数:
    • socket:设置的套接字。
    • option_name:选项的名称。
    • option_value:option_name选项的值。对于接受类型为“字符串”的选项,提供的字节数据要么不包含零字节,要么以单个零字节结束(以ASCII NUL字符结束)。
    • option_len:是option_value选项值的字节大小。
  • 返回值:
    • 成功:返回0
    • 失败:返回-1并将errno设置为以下的值之一:
      • EINVAL:请求的选项option_name未知,或者请求的option_len或option_value无效。
      • ETERM:与指定套接字关联的ØMQ 上下文已终止。提供的套接字无效。
      • ENOTSOCK:提供的套接字无效。
      • EINTR:传递信号中断了操作。
  • 下面介绍是可以设置的套接字选项:
    • 注意:所有选项,除了ZMQ_SUBSCRIBE、ZMQ_UNSUBSCRIBE、ZMQ_LINGER、ZMQ_ROUTER_MANDATORY、ZMQ_PROBE_ROUTER、ZMQ_XPUB_VERBOSE、ZMQ_XPUB_VERBOSER、zmq_req_correlation、ZMQ_REQ_RELAXED、ZMQ_SNDHWM和ZMQ_RCVHWM,只对后续套接字绑定/连接有效。
    • 具体来说,安全性选项对后续绑定/连接调用有效,并且可以随时更改以影响后续绑定和/或连接。
  • ZMQ_AFFINITY:设置I/O线程关联。
  • ZMQ_BACKLOG:设置未完成连接队列的最大长度。
  • ZMQ_BINDTODEVICE:设置将套接字绑定到的设备的名称。
  • ZMQ_CONNECT_RID:分配下一个出站连接ID。
  • ZMQ_CONNECT_ROUTING_ID:分配下一个出站路由ID。
  • ZMQ_CONFLATE:仅保留最后一条消息。
  • ZMQ_CONNECT_TIMEOUT:设置connect()超时。
  • ZMQ_CURVE_PUBLICKEY:设置CURVE公钥。
  • ZMQ_CURVE_SECRETKEY:设置CURVE秘密密钥。
  • ZMQ_CURVE_SERVER:设置CURVE服务器角色。
  • ZMQ_CURVE_SERVERKEY:设置CURVE服务器密钥。
  • ZMQ_GSSAPI_PLAINTEXT:禁用GSSAPI加密。
  • ZMQ_GSSAPI_PRINCIPAL:设置GSSAPI主体的名称。
  • ZMQ_GSSAPI_SERVER:设置GSSAPI服务器角色。
  • ZMQ_GSSAPI_SERVICE_PRINCIPAL:设置GSSAPI服务主体的名称。
  • ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE:设置服务主体的名称类型。
  • ZMQ_GSSAPI_PRINCIPAL_NAMETYPE:设置主体的名称类型。
  • ZMQ_HANDSHAKE_IVL:设置最大握手间隔。
  • ZMQ_HEARTBEAT_IVL:设置发送ZMTP心跳的间隔。
  • ZMQ_HEARTBEAT_TIMEOUT:设置ZMTP心跳超时。
  • ZMQ_HEARTBEAT_TTL:设置ZMTP心跳的TTL值。
  • ZMQ_IDENTITY:设置套接字标识。
  • ZMQ_INVERT_MATCHING:反转消息过滤。
  • ZMQ_IPV6:在套接字上启用IPv6。
  • ZMQ_LINGER:设置套接字关闭的延迟时间。
  • ZMQ_MAXMSGSIZE:可接受的最大入站邮件大小。
  • ZMQ_METADATA:将应用程序元数据属性添加到套接字。
  • ZMQ_MULTICAST_HOPS:组播数据包的最大网络跳数。
  • ZMQ_MULTICAST_MAXTPDU:组播数据包的最大传输数据单元大小。
  • ZMQ_PLAIN_PASSWORD:设置PLAIN安全密码。
  • ZMQ_PLAIN_SERVER:设置PLAIN服务器角色。
  • ZMQ_PLAIN_USERNAME:设置PLAIN安全用户名。
  • ZMQ_USE_FD:设置预分配的套接字文件描述符。
  • ZMQ_PROBE_ROUTER:到ROUTER套接字的引导连接。
  • ZMQ_RATE:设置多播数据速率。
  • ZMQ_RCVBUF:设置内核接收缓冲区的大小。
  • ZMQ_RCVHWM:
  • ZMQ_RCVTIMEO:使用EAGAIN返回recv操作之前的最长时间
  • ZMQ_RECONNECT_IVL:设置重新连接间隔
  • ZMQ_RECONNECT_IVL_MAX:设置最大重新连接间隔
  • ZMQ_RECOVERY_IVL:设置多播恢复间隔
  • ZMQ_REQ_CORRELATE:匹配请求的答复
  • ZMQ_REQ_RELAXED:放松请求和答复之间的严格交替
  • ZMQ_ROUTER_HANDOVER:处理ROUTER套接字上的重复客户端路由ID
  • ZMQ_ROUTER_MANDATORY:仅在ROUTER套接字上接受可路由消息
  • ZMQ_ROUTER_RAW:将ROUTER套接字切换到原始模式
  • ZMQ_ROUTING_ID:设置套接字路由ID
  • ZMQ_SNDBUF:设置内核发送缓冲区的大小
  • ZMQ_SNDHWM:
  • ZMQ_SNDTIMEO:使用EAGAIN返回发送操作之前的最长时间。
  • ZMQ_SOCKS_PROXY:设置SOCKS5代理地址。
  • ZMQ_STREAM_NOTIFY:发送连接和断开连接通知。
  • ZMQ_SUBSCRIBE:建立消息过滤器。
  • ZMQ_TCP_KEEPALIVE:覆盖SO_KEEPALIVE套接字选项。
  • ZMQ_TCP_KEEPALIVE_CNT:覆盖TCP_KEEPCNT套接字选项。
  • ZMQ_TCP_KEEPALIVE_IDLE:覆盖TCP_KEEPIDLE(或某些操作系统上的TCP_KEEPALIVE)。
  • ZMQ_TCP_KZMQ_TCP_MAXRT:设置TCP最大重传超时EEPALIVE_INTVL:覆盖TCP_KEEPINTVL套接字选项。
  • ZMQ_TCP_MAXRT:设置TCP最大重传超时。
  • ZMQ_TOS:在套接字上设置服务类型。
  • ZMQ_UNSUBSCRIBE:删除消息过滤器。
  • ZMQ_XPUB_VERBOSE:在XPUB套接字上传递重复的订阅消息。
  • ZMQ_XPUB_VERBOSER:在XPUB套接字上传递重复的订阅和取消订阅消息。
  • ZMQ_XPUB_MANUAL:将订阅处理更改为手动。
  • ZMQ_XPUB_NODROP:
  • ZMQ_XPUB_WELCOME_MSG:设置用户连接时将收到的欢迎消息。
  • ZMQ_ZAP_DOMAIN:设置RFC 27身份验证域。
  • ZMQ_ZAP_ENFORCE_DOMAIN:设置ZAP域处理以严格遵守RFC。
  • ZMQ_TCP_ACCEPT_FILTER:分配过滤器以允许新的TCP连接。
  • ZMQ_IPC_FILTER_GID:分配组ID过滤器以允许新的IPC连接。
  • ZMQ_IPC_FILTER_PID:分配进程ID过滤器以允许新的IPC连接。
  • ZMQ_IPC_FILTER_UID:分配用户ID过滤器以允许新的IPC连接。
  • ZMQ_IPV4ONLY:仅在套接字上使用IPv4。
  • ZMQ_VMCI_BUFFER_SIZE:设置VMCI套接字的缓冲区大小。
  • ZMQ_VMCI_BUFFER_MIN_SIZE:设置VMCI套接字的最小缓冲区大小。
  • ZMQ_VMCI_BUFFER_MAX_SIZE:设置VMCI套接字的最大缓冲区大小。
  • MQ_VMCI_CONNECT_TIMEOUT:设置VMCI套接字的连接超时。
  • ZMQ_MULTICAST_LOOP:控制多播本地环回。
  • ZMQ_ROUTER_NOTIFY:发送连接和断开连接通知。
  • 演示案例如下:在zmq_sub套接字上订阅消息。
/* Subscribe to all messages */
rc = zmq_setsockopt (socket, ZMQ_SUBSCRIBE, "", 0);
assert (rc == 0);
/* Subscribe to messages prefixed with "ANIMALS.CATS" */ rc = zmq_setsockopt (socket, ZMQ_SUBSCRIBE, "ANIMALS.CATS", 12);
  • 演示案例如下:设置I / O线程关联。
int64_t affinity;

/* Incoming connections on TCP port 5555 shall be handled by I/O thread 1 */
affinity = 1;
rc = zmq_setsockopt (socket, ZMQ_AFFINITY, &affinity, sizeof (affinity));
assert (rc);

rc = zmq_bind (socket, "tcp://lo:5555");
assert (rc);

/* Incoming connections on TCP port 5556 shall be handled by I/O thread 2 */
affinity = 2;
rc = zmq_setsockopt (socket, ZMQ_AFFINITY, &affinity, sizeof (affinity));
assert (rc);

rc = zmq_bind (socket, "tcp://lo:5556"); assert (rc);

ØMQ不是一个中性载体(附ZMQ_ROUTER_RAW选项)

  • ØMQ初学者常问的一个问题是:“我怎样用ØMQ编写一个某某服务器呢?”。
  • ØMQ不是一个中性载体:我们能够使用普通套接字承载HTTP请求和响应,但是ØMQ不能实现这种,ØMQ不是一个中性载体,它规定了它使用的传输协议的框架。这个框架不与现有的往往用自己的框架的协议兼容。例如,比较一个HTTP请求和一个ØMQ请求(如下图所示),两个都在TCP/IP上运行。HTTP请求使用CRLF(回车换行)作为最简单的框架分隔符,而ØMQ使用指定了长度的帧(zmq_msg_t结构)。

  • 所以,你可以使用ØMQ编写类似于HTTP的协议,例如使用请求-应答套接字模式来实现,但它不会是HTTP。
  • 然而,从ØMQ v3.3开始,ØMQ有一个叫做ZMQ_ROUTER_RAW的套接字选项,让你无须利用ØMQ帧来读取和写入数据。你可以使用它来读取和写入正确的HTTP请求和响应。Hardeep Singh促成了这个变化,以使他可以从他的ØMQ应用程序连接到远程登录服务器。

二、获取套接字选项(zmq_getsockopt)

int zmq_getsockopt(void *socket, int option_name, void *option_value, size_t *option_len);
  • API参考文档参阅:http://api.zeromq.org/master:zmq-getsockopt
  • 功能:获取套接字选项。
  • 参数:
    • socket:检查的套接字。
    • option_name:要检查的套接字选项。
    • option_value:用户手动申请传入的,用来保存查询的套接字选项的值。
    • option_len:参数option_value缓冲区对应的大小。
  • 返回值:
    • 成功:返回0。
    • 失败:返回-1并将errno设置为以下的值之一:
      • EINVAL:所请求的选项option_name未知,或者所请求的option_len或option_value无效,或者由option_len指定的option_value所指向的缓冲区大小不足以存储选项值。
      • ETERM:与指定套接字关联的ØMQ 上下文已终止。提供的套接字无效。
      • ENOTSOCK:提供的套接字无效。
      • EINTR:传递信号中断了操作。
  • 可以检索的选项如下:
  • ZMQ_AFFINITY:检索I / O线程关联。
  • ZMQ_BACKLOG:检索未完成连接队列的最大长度。
  • ZMQ_BINDTODEVICE:检索套接字绑定到的设备的名称。
  • ZMQ_CONNECT_TIMEOUT:检索connect()超时。
  • ZMQ_CURVE_PUBLICKEY:检索当前的CURVE公钥。
  • ZMQ_CURVE_SECRETKEY:检索当前的CURVE秘密密钥。
  • ZMQ_CURVE_SERVERKEY:检索当前的CURVE服务器密钥。
  • ZMQ_EVENTS:检索套接字事件状态。
  • ZMQ_FD:检索与套接字关联的文件描述符。
  • ZMQ_GSSAPI_PLAINTEXT:检索GSSAPI纯文本或加密状态。
  • ZMQ_GSSAPI_PRINCIPAL:检索GSSAPI主体的名称。
  • ZMQ_GSSAPI_SERVER:检索当前的GSSAPI服务器角色。
  • ZMQ_GSSAPI_SERVICE_PRINCIPAL:检索GSSAPI服务主体的名称。
  • ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE:检索服务主体的名称类型。
  • ZMQ_GSSAPI_PRINCIPAL_NAMETYPE:检索服务主体的名称类型。
  • ZMQ_HANDSHAKE_IVL:检索最大握手间隔。
  • ZMQ_IDENTITY:检索套接字标识。
  • ZMQ_IMMEDIATE:检索连接附加值。
  • ZMQ_INVERT_MATCHING:检索反向过滤状态。
  • ZMQ_IPV4ONLY:检索仅IPv4的套接字覆盖状态。
  • ZMQ_IPV6:检索IPv6套接字状态。
  • ZMQ_LAST_ENDPOINT:检索上一个端点集。
  • ZMQ_LINGER:检索套接字关闭的延迟时间。
  • ZMQ_MAXMSGSIZE:可接受的最大入站邮件大小。
  • ZMQ_MECHANISM:检索当前的安全机制。
  • ZMQ_MULTICAST_HOPS:组播数据包的最大网络跳数。
  • ZMQ_MULTICAST_MAXTPDU:组播数据包的最大传输数据单元大小。
  • ZMQ_PLAIN_PASSWORD:检索当前密码。
  • ZMQ_PLAIN_SERVER:检索当前的PLAIN服务器角色。
  • ZMQ_PLAIN_USERNAME:检索当前的PLAIN用户名。
  • ZMQ_USE_FD:检索预分配的套接字文件描述符。
  • ZMQ_RATE:检索多播数据速率。
  • ZMQ_RCVBUF:检索内核接收缓冲区的大小。
  • ZMQ_RCVHWM:
  • ZMQ_RCVMORE:接下来的更多消息数据部分。
  • ZMQ_RCVTIMEO:使用EAGAIN返回套接字操作之前的最长时间。
  • ZMQ_RECONNECT_IVL:检索重新连接间隔。
  • ZMQ_RECONNECT_IVL_MAX:检索最大重新连接间隔。
  • ZMQ_RECOVERY_IVL:获取多播恢复间隔。
  • ZMQ_ROUTING_ID:检索套接字路由ID。
  • ZMQ_SNDBUF:检索内核传输缓冲区大小。
  • ZMQ_SNDHWM:
  • ZMQ_SNDTIMEO:使用EAGAIN返回套接字操作之前的最长时间。
  • ZMQ_SOCKS_PROXY:检索SOCKS5代理地址。
  • ZMQ_TCP_KEEPALIVE:覆盖SO_KEEPALIVE套接字选项。
  • ZMQ_TCP_KEEPALIVE_CNT:覆盖TCP_KEEPCNT套接字选项。
  • ZMQ_TCP_KEEPALIVE_IDLE:覆盖TCP_KEEPIDLE(或某些操作系统上的TCP_KEEPALIVE)。
  • ZMQ_TCP_KEEPALIVE_INTVL:覆盖TCP_KEEPINTVL套接字选项。
  • ZMQ_TCP_MAXRT:检索最大TCP重传超时。
  • ZMQ_THREAD_SAFE:检索套接字线程安全。
  • ZMQ_TOS:检索服务类型套接字覆盖状态。
  • ZMQ_TYPE:检索套接字类型。
  • ZMQ_ZAP_DOMAIN:检索RFC 27身份验证域。
  • ZMQ_ZAP_ENFORCE_DOMAIN:检索ZAP域处理模式。
  • ZMQ_VMCI_BUFFER_SIZE:检索VMCI套接字的缓冲区大小。
  • ZMQ_VMCI_BUFFER_MIN_SIZE:检索VMCI套接字的最小缓冲区大小。
  • ZMQ_VMCI_BUFFER_MAX_SIZE:检索VMCI套接字的最大缓冲区大小。
  • ZMQ_VMCI_CONNECT_TIMEOUT:检索VMCI套接字的连接超时。
  • ZMQ_MULTICAST_LOOP:检索多播本地环回配置。
  • ZMQ_ROUTER_NOTIFY:检索路由器套接字通知设置。
  • 演示案例如下:检索外发消息的高水位线。
/* Retrieve high water mark into sndhwm */
int sndhwm;
size_t sndhwm_size = sizeof (sndhwm);
rc = zmq_getsockopt (socket, ZMQ_SNDHWM, &sndhwm, &sndhwm_size); 
assert (rc == 0);

  • 我是小董,V公众点击"笔记白嫖"解锁更多【ZeroMQ】资料内容。

 

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页