ZeroMQ:07---基础篇之(套接字选项:zmq_setsockopt()、zmq_getsockopt())

一、设置套接字选项(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:如果到达SENDHWM,请不要静默丢弃消息
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);

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/106786926
zmq
今日推荐