ZeroMQ接口函数之 :zmq_getsockopt – 获取ZMQ socket的属性

时间:2023-03-08 17:21:38
ZeroMQ接口函数之 :zmq_getsockopt – 获取ZMQ socket的属性

ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html

本文地址 :http://www.cnblogs.com/fengbohello/p/4474333.html

翻译:郝峰波

mail : fengbohello@qq.com


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 == );

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