ZeroMQ:--基础篇之(zmq_setsockopt()、zmq_getsockopt())
一、设置套接字选项(zmq_setsockopt)
int zmq_setsockopt(void *socket, int option_name, const void *option_value, size_t option_len);
功能:设置套接字选项
参数:
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);