ZeroMQ接口函数之 :zmq_getsockopt – 获取ZMQ socket的属性
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html
本文地址 :http://www.cnblogs.com/fengbohello/p/4474333.html
ZeroMQ 官方地址:http://api.zeromq.org/4-0:zmq-getsockopt
zmq_getsockopt(3) ØMQ Manual -ØMQ/4.0.6
Name
zmq_getsockopt – 获取ZMQ socket的属性
Synopsis
int zmq_getsockopt (void *socket, int option_name, void*option_value, size_t *option_len);
Description
zmq_getsockopt()函数会取回socket参数指定的socket上,option_name参数指定的属性的值,并且把这个值存储在option_value参数指定的存储空间中。option_len参数指定了option_value参数指定的存储空间的大小(以字节计算);在成功的情况下,zmq_getsockopt()函数会修改option_len参数指定的值,以确保在内存中存储的属性值的真是情况。
以下的属性值可以通过zmq_getsockopt()函数返回。
ZMQ_TYPE:返回socket的类型
ZMQ_TYPE属性会返回socket参数指定的socket的类型。socket的类型是在创建的时候指定的,并且在之后不能修改。
属性值的类型 |
int |
属性值的单位 |
N/A |
默认值 |
N/A |
可以应用的socket类型 |
所有类型 |
ZMQ_RCVMORE:接下来是否会否更多消息帧
如果刚刚接到的一帧消息后面还有更多的消息帧,那么ZMQ_RCVMORE属性会返回True(1)。如果后面没有剩余的帧了,那么会返回False(0)。请参考zmq_send(3)和zmq_recv(3)函数来获取关于多帧消息的更多细节。
属性值的类型 |
int |
属性值的单位 |
布尔 |
默认值 |
N/A |
可以应用的socket类型 |
所有类型 |
ZMQ_SNDHWM:返回向外发送消息的高水位
ZMQ_SNDHWM属性会返回socket参数指定的socket的向外发送的消息的高水位标记。这个高水位是未解决的消息队列长度最大值的硬限制,对于socket参数指定的socket所连接的任何一个对端, ZMQ在内存中维护一个消息队列。这个属性值是0表示没有限制。
如果到达了这个限制,这个socket会进入一种异常的状态,ZMQ会根据socket的类型而进行阻塞或者丢弃消息等的操作。参考zmq_socket(3)函数以获得每个类型的socket准确的行为。
属性值的类型 |
int |
属性值的单位 |
消息 |
默认值 |
1000 |
可以应用的socket类型 |
所有类型 |
ZMQ_RCVHWM:返回接收消息的高水位
ZMQ_RCVHWM属性会返回socket参数指定的socket上接收消息的高水位。这个高水位是未解决的消息队列长度最大值的硬限制,对于socket参数指定的socket所连接的任何一个对端, ZMQ在内存中维护一个消息队列。这个属性值是0表示没有限制。
如果到达了这个限制,这个socket会进入一种异常的状态,ZMQ会根据socket的类型而进行阻塞或者丢弃消息等的操作。参考zmq_socket(3)函数以获得每个类型的socket准确的行为。
属性值的类型 |
int |
属性值的单位 |
消息 |
默认值 |
1000 |
可以应用的socket类型 |
所有类型 |
ZMQ_AFFINITY:返回I/O线程关联
ZMQ_AFFINITY属性会返回socket参数指定的socket上最新创建的链接的I/O关联。
关联决定了这个socket相联系的context的线程池中的哪一个线程来接管新建立的连接。属性值是0表示没有关联,意味着任务会在线程池中的所有线程中公平的分配。对于非0值,最低位的一位(二进制位)对应线程1,次低位对应线程2,等等…例如,值是3表示接下来建立的连接会唯一的被线程1和2接管。
也可以参考zmq_init(3)函数获取对指定的context的分配I/O线程数的细节。
属性值的类型 |
uint_64 |
属性值的单位 |
N/A(位图) |
默认值 |
0 |
可以应用的socket类型 |
N/A |
ZMQ_IDENTITY:返回socket的身份
ZMQ_IDENTITY属性会返回socket参数指定的socket的身份ID。身份ID只在请求/回复模式中使用。也就是说,可以在ROUTER类型耳朵socket上通过指定的身份ID把消息路由到这个对端上,而实现串联。
身份ID至少需要1字节并且至多255字节长度。以二进制0开头的身份ID是ZMQ基础结果保留的。
属性值的类型 |
二进制数据 |
属性值的单位 |
N/A |
默认值 |
NULL |
可以应用的socket类型 |
ZMQ_REP,ZMQ_REQ,ZMQ_ROUTER,ZMQ_DEALER |
ZMQ_RATE:返回多路广播数据速率
ZMQ_RATE选项返回使用socket指定的socket进行多路广播的时候发送或者接收数据的最大值。
属性值的类型 |
int |
属性值的单位 |
Kb/s |
默认值 |
100 |
可以应用的socket类型 |
当使用多路传输方式时,所有socket可用 |
ZMQ_RECOVERY_IVL:获取多播时的恢复间隔
ZMQ_RECOVERY_IVL属性会返回socket参数指定的socket多路广播传输模式时的恢复间隔。恢复时间决定了当一个广播组中不可恢复的消息在被丢弃前,一个接收者在一个广播组里面缺席的最长毫秒时间。
属性值的类型 |
int |
属性值的单位 |
毫秒 |
默认值 |
10000 |
可以应用的socket类型 |
当使用多路传输方式时,所有socket可用 |
ZMQ_SNDBUF:返回内核传输缓冲区的大小
ZMQ_SNDBUF属性会返回socket参数指定的socket的底层内核的传输缓存的大小。如果这个值是0,则说明OS的默认值是生效的。要获取更多细节请参考您的操作系统文档中关于SO_SNDBUF的套接字属性。
属性值的类型 |
int |
属性值的单位 |
B |
默认值 |
0 |
可以应用的socket类型 |
所有socket可用 |
ZMQ_RCVBUF:返回内核的接收缓存大小
ZMQ_RCVBUF属性会返回socket参数指定的socket的底层内核的接收缓存大小。如果返回值是0,说明OS的默认值在起作用。要获取更多细节请参考您的操作系统文档中关于SO_RCVBUF的套接字属性。
属性值的类型 |
int |
属性值的单位 |
B |
默认值 |
0 |
可以应用的socket类型 |
所有socket可用 |
ZMQ_LINGER:返回关闭socket的时候的存留时间(linger period)
ZMQ_LINGER属性会返回socket参数指定的socket的存留时间。存留时间决定了当socket被zmq_close(3)关闭后,将要被发送而没有发送到另一端的消息在内存中能够停留的时间。这会进一步影响与此socket相关联的context使用zmq_term(3)方式进行终结的结果。下面指出了几种不同的行为:
●默认值是 -1,指定一个无限的存留时间。在此期间的消息不会由于zmq_close()函数的使用而被终结。试图使用zmq_term()函数来终结于此socket相关联的context的行为会被阻塞,直到消息被发送到对端为止。
●属性值是0指明了没有存留时间。当使用zmq_close()关闭socket的时候,消息队列中的消息会被立刻丢弃。
●属性值是正数表示会绑定一个毫秒级的正值。在调用zmq_close()函数后,发送消息队列中的消息不会被丢弃;试图使用zmq_term()函数对与socket相关联的context进行终结的操作都会被阻塞,直到所有的消息都被发送到对端,或者停留时间结束了,停留时间结束的时候,消息队列中的所有消息都会被丢弃。
属性值的类型 |
int |
属性值的单位 |
毫秒 |
默认值 |
-1 |
可以应用的socket类型 |
所有socket可用 |
ZMQ_RECONNECT_IVL:返回重连时间间隔
ZMQ_RECONNECT_IVL属性会返回scoket指定的socket的初始化重连间隔。重连间隔是当使用面向连接的传输方式的时候,在连接断开的时候,ZMQ尝试重新进行连接的等待周期。属性值是 -1表示不需要重连。
重连周期可能会被ZMQ随机选取,以避免当一个socket连接了多个对端的时候网络拓扑中出现重连风暴。
属性值的类型 |
int |
属性值的单位 |
毫秒 |
默认值 |
100 |
可以应用的socket类型 |
面向连接的传输方式时,所有socket可用 |
ZMQ_RECONNECT_IVL_MAX:返回重连间隔的最大值
ZMQ_RECONNECT_IVL_MAX属性返回socket参数指定的socket重连间隔的最大值。这个属性是在你两次尝试重连之间等待时间的最大值。在每次重连的时候,重连间隔都会是前一次的两倍,直到到达ZMQ_RECONNECT_IVL_MAX。这个属性允许指数补偿策略。默认值是非指数执行方式,并且重连间隔只基于ZMQ_RECONNECT_IVL。
小于ZMQ_RECONNECT_IVL的值都会被忽略。
属性值的类型 |
int |
属性值的单位 |
毫秒 |
默认值 |
0(只使用ZMQ_RECONNECT_IVL) |
可以应用的socket类型 |
面向连接的传输方式时,所有socket可用 |
ZMQ_BACKLOG:返回未解决的链接队列的最大值
ZMQ_BACKLOG属性返回socket参数指定的socket上未解决的链接队列长度的最大值;这只对面向连接的传输方式有效。要获得更多细节,请参考您的操作系统文档中关于listen函数的部分。
属性值的类型 |
int |
属性值的单位 |
链接 |
默认值 |
100 |
可以应用的socket类型 |
面向连接的传输方式时,所有socket可用 |
ZMQ_MAXMSGSIZE:流入的消息大小的最大值
这个属性会返回流入的消息的限制。如果一个对端发送了一个比ZMQ_MAXMSGSIZE长的消息,这个链接就会断开。值是 -1表示没有限制。
属性值的类型 |
int64_t |
属性值的单位 |
B |
默认值 |
-1 |
可以应用的socket类型 |
所有socket可用 |
ZMQ_MULTICAST_HOPS:广播包的最大网络跳数
这个属性用于返回向外发送的广播包的存活时间。默认值是 -1,表示这个广播包不能够离开本地网络。
属性值的类型 |
int |
属性值的单位 |
网络跳数 |
默认值 |
-1 |
可以应用的socket类型 |
当使用广播传输方式时,所有socket可用 |
ZMQ_RCVTIMEO:在一个socket操作返回EAGAIN错误之前的最长时间
返回在一个socket上执行接收操作的超时时间。如果这个属性值是0,zmq_recv(3)函数会立即返回,如果没有消息可用就返回EAGAIN错误。如果这个属性值是 -1,这个操作就会阻塞,直到有消息可用为止。对于所有其它值,这个操作会在返回EAGAIN错误先等待接收消息这么长的时间。
属性值的类型 |
int |
属性值的单位 |
毫秒 |
默认值 |
-1(无限等待) |
可以应用的socket类型 |
所有socket可用 |
ZMQ_SNDTIMEO:在一个socket操作返回EAGAIN错误之前的最长时间
返回socekt上发送操作超时时间。如果这个属性值是0,zmq_send(3)函数就会立即返回,如果这个消息无法发送,就返回EAGAIN错误代码。如果这个属性值是 -1,发送操作会阻塞,直到消息被发送出去为止。对于所有其它的值,在返回EAGAIN错误之前,发送操作会在这段时间内尝试发送消息。
属性值的类型 |
int |
属性值的单位 |
毫秒 |
默认值 |
-1(无限等待) |
可以应用的socket类型 |
所有socket可用 |
ZMQ_IPV6:返回socket的IPv6状态
返回这个socket的IPv6属性。如果这个值是1,表示IPv6在这个socket上允许使用;如果是0,表示这个socket只能使用IPv4。如果IPv6是可用的,这个socket可以连接/接受IPv4/IPv6主机的连接。
属性值的类型 |
int |
属性值的单位 |
布尔 |
默认值 |
0(否) |
可以应用的socket类型 |
当使用TCP连接的时候,所有socket可用 |
ZMQ_IPV4ONLY:返回只使用IPv4的socket代理状态
返回这个socket只使用IPv4的属性。这个属性请慎用。
请使用ZMQ_IPV6属性。
属性值的类型 |
int |
属性值的单位 |
布尔 |
默认值 |
1(是) |
可以应用的socket类型 |
当使用TCP连接的时候,所有socket可用 |
ZMQ_IMMEDIATE:返回连接接触的值
返回连接接触的状态值。如果设置为1,回延迟连接上的接触管道,直到底层的连接建立完成了。如果没有其它的连接,这回导致这个socket阻塞;但是会防止在等待连接的期间出现消息队列被填满。
属性值的类型 |
int |
属性值的单位 |
布尔 |
默认值 |
0(否) |
可以应用的socket类型 |
所有socket可用,当使用TCP/IPC传输方式的时候首先考虑 |
ZMQ_FD:返回与这个socket联系的文件描述符
ZMQ_FD属性会返回与这个socket相联系的文件描述符。被返回的文件描述符可以被用来把这个socket集成到一个已经存在的事件循环里面; ZMQ动态链接库会通过标记文件描述符已准备好被读取了,当这个socket上有任何事件处于一种边沿触发方式的时候。
能否从返回的文件描述符中读取数据,不须要指明是否能够从底层的socket中读取或者写入;应用程序必须通过ZMQ_EVENTS属性进行后续的检索,来检查真是的事件状态。
返回的文件描述符也必须使用zmq_send 和zmq_recv函数在内部使用。因为文件描述符是边缘触发中断的,应用程序在每次调用zmq_send 或者 zmq_recv函数进行读取之后都需要更新ZMQ_EVENTS的状态。说的更明确:在调用zmq_send函数之后,这个socket可能变得可读了(反之亦然),但是并没有在这个问价描述符上触发一次读事件。
返回的文件描述符被设计用于使用poll或者类似的系统调用。应用程序千万不要试图直接对其进行数据读写,也不要试图关闭它。
属性值的类型 |
在POSIX系统中为int,在Windows系统中为SOCKET |
属性值的单位 |
N/A |
默认值 |
N/A |
可以应用的socket类型 |
所有socket可用 |
ZMQ_EVENTS:返回socket的事件状态
ZMQ_EVENTS属性会返回socket参数指定的socket的事件状态。返回值是一个由下列事件标志进行或操作的组合:
ZMQ_POLLIN:指出至少有一个消息可以在此socket上就行非阻塞接收。
ZMQ_POLLOUT:指出至少有一个消息可以在此socket上进行非阻塞发送。
被ZMQ_FD属性返回的文件描述组合,已经可以被读取数据但是ZMQ_EVENTS属性检查后却没有实际的事件返回的情况也是正常的;应用程序只需要简单的忽略这种情况并且重新启动它们的操作/事件循环即可。
属性值的类型 |
int |
属性值的单位 |
N/A(标志) |
默认值 |
N/A |
可以应用的socket类型 |
所有socket可用 |
ZMQ_LAST_ENDPOINT:返回最后一个终结点
ZMQ_LAST_ENDPOINT属性会返回最后绑定的TCP/IPC传输协议的终结点。返回值会是一个ZMQ DSN格式的字符串。注意,如果TCP主机是INADDR_ANY,或者是由*指定的,那么返回值会是0.0.0.0(IPv4)。
属性值的类型 |
以NULL结尾的字符串 |
属性值的单位 |
N/A |
默认值 |
NULL |
可以应用的socket类型 |
当使用TCP/IPC协议的时候,所有socket可用 |
ZMQ_TCP_KEEPALIVE:重写SO_KEEPALIVE socket属性
重写SO_KEEPALIVE socket 属性(被OS支持的)。默认值是 -1,表示跳过任何重写操作,并且使用系统的默认值。
属性值的类型 |
int |
属性值的单位 |
-1, 0 , 1 |
默认值 |
-1(使用OS的默认值) |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
ZMQ_TCP_KEEPALIVE_IDLE:重写TCP_KEEPCNT(或者一些系统上的TCP_KEEPALIVE)
重写TCP_KEEPCNT(或者一些OS上的TCP_KEEPALIVE)属性(被OS支持的)。默认值是 -1,表示跳过任何重写操作并使用OS的默认值。
属性值的类型 |
int |
属性值的单位 |
-1, >0 |
默认值 |
-1(使用OS的默认值) |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
ZMQ_TCP_KEEPALIVE_CNT:重写TCP_KEEPCNT socket属性
重写TCP_KEEPCNT socket属性(被操作系统支持的)。默认值是 -1,表示跳过所有的重写操作并且使用系统的默认值。
属性值的类型 |
int |
属性值的单位 |
-1, >0 |
默认值 |
-1(使用OS的默认值) |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
ZMQ_TCP_KEEPALIVE_INTVL:重写TCP_KEEPINTVL socket属性
重写TCP_KEEPINTVL socket属性(被操作系统支持的)。默认值是 -1,表示跳过所有的重写操作,并且使用操作系统的默认值。
属性值的类型 |
int |
属性值的单位 |
-1, >0 |
默认值 |
-1(使用OS的默认值) |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
ZMQ_MECHANISM:返回当前的安全机制
ZMQ_MECHANISM属性返回这个socket当前的安全机制。
属性值的类型 |
int |
属性值的单位 |
ZMQ_NULL, ZMQ_PLAIN, 或者ZMQ_CURVE |
默认值 |
ZMQ_NULL |
可以应用的socket类型 |
当使用TCP/IPC协议的时候,所有socket可用 |
ZMQ_PLAIN_SERVER:返回当前PLAIN服务的角色
返回ZMQ_PLAIN_SERVER属性,如果有的话,socket预设的。
属性值的类型 |
int |
属性值的单位 |
0,1 |
默认值 |
int |
可以应用的socket类型 |
当使用TCP/IPC协议的时候,所有socket可用 |
ZMQ_PLAIN_USERNAME:返回当前PLAIN的用户名
ZMQ_PLAIN_USERNAME属性会返回给PLAIN安全机制最后设置的用户名。返回值必须是一个以NULL结尾的字符串或者空字符串。返回的空间大小应该包括这个结尾的字符字节。
属性值的类型 |
以NULL结尾的字符串 |
属性值的单位 |
N/A |
默认值 |
空字符串 |
可以应用的socket类型 |
当使用TCP/IPC协议的时候,所有socket可用 |
ZMQ_PLAIN_PASSWORD:返回当前的密码
ZMQ_PLAIN_PASSWORD属性返回给PLAIN安全机制最后设置的密码。返回值必须是一个以NULL结尾的字符串或者空字符串。返回的空间大小应该包括这个空字节。
属性值的类型 |
以NULL结尾的字符串 |
属性值的单位 |
N/A |
默认值 |
空字符串 |
可以应用的socket类型 |
当使用TCP/IPC协议的时候,所有socket可用 |
ZMQ_CURVE_PUBLICKEY:返回当前CURVE的公钥
返回此socket上当前长期公钥。你可以提供一个32B的存储空间,来接收二进制公钥值,或者41B的存储空间,来接收Z85格式的值。注意:为了能够取得一个可打印的公钥,存储空间必须是41B的大小,40B用来存放公钥值,1B存放空字符。
属性值的类型 |
二进制数据或Z85字符串 |
属性值的单位 |
32或41 |
默认值 |
空字符串 |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
ZMQ_CURVE_SECRETKEY:返回当前的CURVE socket 秘钥
返回此socket的当前长期秘钥。以可以提供一个32B的存储空间,来接收二进制秘钥,或者41B的存储空间,来接收Z85格式的可打印秘钥。
属性值的类型 |
二进制数据或Z85字符串 |
属性值的单位 |
32或41 |
默认值 |
空字符串 |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
ZMQ_CURVE_SERVERKEY:返回当前的CURVE服务器码
返回客户端socket的当前的服务器码。你可以提供32B的存储空间,来接收二进制的值,或者41B的存储空间,来接收Z85格式的可打印值。
属性值的类型 |
二进制数据或Z85字符串 |
属性值的单位 |
32或41 |
默认值 |
空字符串 |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
ZMQ_ZAP_DOMAIN:返回RFC 27的认证域
ZMQ_ZAP_DOMAIN属性会返回给此socket最后设置的ZAP域。返回值可能是一个以NULL结尾的字符串,或者空字符串。返回的字符串长度应该包括最后的结束字符。
属性值的类型 |
字符串 |
属性值的单位 |
N/A |
默认值 |
无设置 |
可以应用的socket类型 |
当使用TCP协议的时候,所有socket可用 |
Return value
如果执行成功,zmq_getsockopt()函数会返回0。否则会返回 -1,并且设置errno为下列中定义的值。
Errors
EINVAL
请求的属性名称option_name未知;或者option_len或option_value参数不可用;或者由option_value参数指定的存储空间的大小,即参数option_len太小。
ETERM
与socket参数指定的socket相联系的context被终结了。
ENOTSOCK
参数提供的socket不可用。
EINTR
此操作被传来的信号中断了。
Example
返回向外发送的消息的高水位
/* 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);
See also
zmq_setsockopt(3) zmq_socket(3) 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.
Web site design and content is copyright (c) 2007-2012 iMatix Corporation. Contact us for professional support. Site content licensed under the Creative Commons Attribution-Share Alike 3.0 License. ØMQ is copyright (c) Copyright (c) 2007-2012 iMatix Corporation and Contributors. ØMQ is free software licensed under the LGPL. ØMQ, ZeroMQ, and 0MQ are trademarks of iMatix Corporation. Terms of Use — Privacy Policy
作 者:fengbohello
个人网站:http://www.fengbohello.top/
E-mail : fengbohello@foxmail.com
欢迎转载,转载请注明作者和出处。
因作者水平有限,不免出现遗漏和错误。希望热心的同学能够帮我指出来,我会尽快修改。愿大家共同进步,阿里嘎多~