zmq_setsockopt –设置ZMQ socket的属性
Synopsis
int zmq_setsockopt (void *socket, int option_name, const void *option_value, size_t option_len);
注意:除了以下属性,所有的属性均需要在对socket进行bind/connect操作之前设置:
ZMQ_SUBSCRIBE, ZMQ_UNSUBSCRIBE, ZMQ_LINGER, ZMQ_ROUTER_HANDOVER,
ZMQ_ROUTER_MANDATORY, ZMQ_PROBE_ROUTER, ZMQ_XPUB_VERBOSE, ZMQ_REQ_CORRELATE, and ZMQ_REQ_RELAXED
特别的,安全的属性也可以在bind/connect操作之后生效,并且可以随时进行修改并影响之后的bind/connect操作。
Description
zmq_setsockopt()函数会对socket参数指定的socket进行设置,设置的属性由option_name参数指定,属性值由参数option_value指定。option_len参数指定属性值的数据存储空间的大小。
以下的socket属性可以通过zmq_setsockopt()函数进行设置:
ZMQ_SNDHWM:对向外发送的消息设置高水位(最大缓存量)
ZMQ_SNDHWM属性将会设置socket参数指定的socket对外发送的消息的高水位。高水位是一个硬限制,它会限制每一个与此socket相连的在内存中排队的未处理的消息数目的最大值。0值代表着没有限制。
如果已经到达了规定的限制,socket就需要进入一种异常的状态,表现形式因socket类型而异。socket会进行适当的调节,比如阻塞或者丢弃已发送的消息。请从zmq_socket(3)函数中查看更多细节,获取每种类型的socket的精确的行为。
ZMQ并不能保证可以接收像ZMQ_SNDHWM参数一样多的消息,而实际的限制可能在60~70%一下,这取决于这个socket上的消息流。
ZMQ_RCVHWM:对进入socket的消息设置高水位
ZMQ_RCVHWM属性将会设置socket参数指定的socket进入的消息的高水位。高水位是一个硬限制,它会限制每一个与此socket相连的在内存中排队的未处理的消息数目的最大值。0值代表着没有限制。
如果已经到达了规定的限制,socket就需要进入一种异常的状态,表现形式因socket类型而异。socket会进行适当的调节,比如阻塞或者丢弃被发送的消息。请从zmq_socket(3)函数中查看更多细节,获取每种类型的socket的精确的行为。
ZMQ_AFFINITY:设置I/O线程关联
ZMQ_AFFINITY属性会对socket参数指定的socket新创建的链接设置I/O线程关联。
关联指明了和scoket相关的context上的哪个线程池中的哪个线程来处理新创建的链接。0值表示没有关联,这意味着工作将在线程池中平等的向所有进程进行分发。对于非0值,最低位对应线程1,第二低位对应线程2,等等。比如,设置的值是3的话,说明socket上这之后的链接请求将被I/P线程1和2处理。
请参见
zmq_init(3)
函数了解更多关于对I/O线程分配的细节。
ZMQ_SUBSCRIBE:创建消息过滤标志
ZMQ_SUBSCRIBE属性将会在ZMQ_SUB类型的socekt上创建一个新的消息过滤标志。新建立的ZMQ_SUB类型socket会对进入socket的所有消息进行过滤,这样你就可以使用这个属性来建立最初的消息过滤项。
一个option_value的长度是0的过滤属性会订阅所有的广播消息。一个非空的option_value值会只订阅所有以option_value的值为前缀的消息。一个ZMQ_SUB类型的socket可以附加多个过滤条件,只要一个消息符合过滤条件中的任何一个就会被接受。
ZMQ_IDENTITY:设置socket 身份ID
ZMQ_IDENTITY选项会设置socket的身份ID。socket的身份ID只会能在请求/回复模式中使用。也就是说,可以使用ROUTER类型的socket进行socket串联,根据给定的身份ID可以对消息进行路由。
身份ID至少有1 B的长度,最多有255 B的长度。以0位开始的身份ID由ZMQ保留使用。
如果两个socket使用相同的身份ID向第三方进行连接,后果是不确定的。
ZMQ_RECOVERY_IVL:设置多路广播恢复时间
ZMQ_RECOVERY_IVL属性将会对socket参数指定的socket多路广播恢复时间进行设置。恢复时间决定了,当一个接收端从一个广播组退出后再连接上来之前,在数据丢失,导致数据不可恢复前的最大时间间隔,时间以毫秒为单位。
注意:当设置较大的恢复时间时,这回非常耗内存。比如,传输速率是1Gbps时,1分钟长的回复时间,会导致7GB的内存消耗。
ZMQ_LINGER:为socket关闭设置停留时间
ZMQ_LINGER属性会给指定的socket设定关闭前的停留时间。停留时间指定了在对一个socket调用
zmq_close(3)
函数之后,这个socekt上即将被发送但还没有被发送到对端的消息在内存中继续停留的时间。这个属性进而还会影响到与这个scoket相关联的context上
zmq_term(3)
操作的进行终结的结果。下面简述了不同的行为:
属性值 -1表示无限的停留时间。还没被发送的消息在socket调用zmq_close()操作之后不会被丢弃;试图使用zmq_term()操作对context进行终结的操作会被阻塞,直到所有没有被发送的消息被发往对端为止。
属性值0 表示没有停留时间。当使用zmq_close()函数将socket关闭的时候,所有没有被发送呃消息都会被丢弃。
属性是正数值表示设置一个毫秒为单位的停留时间。在第socket调用zmq_close()操作后,还没有发送的消息不会被丢弃;试图使用zmq_term()对于此scoket相关联的context进行终结的时候会被阻塞,直到所有未被发送的消息都被发往对端;或者停留时间已经到达,此时所有未发送的消息都会被丢弃。
ZMQ_RECONNECT_IVL:设置重连间隔
ZMQ_RECONNECT_IVL属性会设置指定的scoket的初始套接字重连间隔。重连间隔是使用面向连接的传输方式的时候,当与对端的链接断开后,尝试再次进行连接时的ZMQ周期。属性值是 -1表示不进行重连。
ZMQ中的重连间隔可能是个随机的较大数值,以防在拓扑结构中重连风暴的发生。
ZMQ_RECONNECT_IVL_MAX:设置重连间隔的最大值
ZMQ_RECONNECT_IVL_MAX属性会设置指定的scoket的重连间隔最大值。这是在ZMQ重连周期之间的最大值。在每次的重连企图中,重连间隔值都会是前一次的两倍,知道达到ZMQ_RECONNECT_IVL_MAX值。这允许指数补偿策略。默认值表示不执行指数补偿策略,并且重连间隔时间只基于ZMQ_RECONNECT_IVL进行计算。
低于ZMQ_RECONNECT_IVL的值将被忽略。
ZMQ_ROUTER_RAW:转换ROUTER socket到原始模式
当设置为1的时候,及把ROUTER 设置为原始模式。当ROUTER为原始模式并且在使用tcp://传输方式的时候,将不会以ZMQ格式读取和写入TCP数据。这就使ZMQ应用程序可以和非ZMQ程序进行交流。当使用原始模式的时候,你不能使用明确的身份ID,并且在发送消息的时候ZMQ_MSGMORE标志也会被忽略。在原始模式下,你可以采用在发送了一个明确的身份ID后,紧跟着发送一个空消息来关闭一个指定的连接。
不建议使用这个选项,请使用ZMQ_STREAM 类型的socket来代替。
ZMQ_PROBE_ROUTER:ROUTER socket 的引导连接
当次属性设置为1的时候,如果有闲的连接建立了或者接受了新的连接,这个scoket就会自动发送一个空的消息。你可以在连接到ROUTER socket的REQ、DEALER或者ROUTER socket上设置这个属性。这些应用程序必须能够区分这个空消息。ZMQ_PROBE_ROUTER属性实际上给ROUTER应用程序提供了一个信号信号,说明一个新的对端活着。
不要在一个向任何socket类型进行会话的socket上设置此属性:结果是未知的。
ZMQ_REQ_RELAXED:放松请求和回复之间严格的轮换
默认情况下,REQ socket 不允许在接收到上一个回复之前使用zmq_send(3)开始一个新的请求。当这个属性值设置为1的时候,会允许发送另一个请求,并且结果是断开与期望回复消息端的底层的链接,在支持重连的传输协议里,会触发一个重连的尝试。请求-回复状态被重置,并且一个新的请求会发送到下一个可用的对端上。
如果设置此属性值为1,应该同时设置ZMQ_REQ_CORRELATE可用,以确保对请求和回复的正确匹配。否则,如果一个已经被断开的链接发来一个迟来的回复,可能会被认作后来的请求的回复。
/* 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);
See also
zmq_getsockopt(3) zmq_socket(3) zmq_plain(7) zmq_curve(7) zmq(7)
Authors
This page was written by the ØMQ community. To make a change please read the ØMQ Contribution Policy at
http://www.zeromq.org/docs:contributing.
本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4398953.html,如需转载请自行联系原作者