找出zerorpc服务器的绑定端口

时间:2014-11-28 10:34:22

标签: port rpc zeromq

当我将zerorpc服务器实例绑定到随机端口时,如下所示:

s = zerorpc.Server(SomeClass())
s.bind('tcp://127.0.0.1:0')

如何找出服务器实际绑定的端口?导致同一目标的另一个问题是:如何访问zerorpc-server的底层ZMQ套接字?

1 个答案:

答案 0 :(得分:0)

为了找到套接字对象,我编写了一个函数,以递归方式搜索变量内的任何ZMQ对象(server_object):

def find_sockets(obj, thiskey, keys_before, results):
    if 'zmq.' in str(type(obj)):
        results.append(keys_before + [thiskey])
    try:
        vars(obj)
    except TypeError:
        return
    for key in vars(obj):
        find_sockets(vars(obj)[key], key, keys_before + [thiskey], results)

s = zerorpc.Server(Dummy())
s.bind('tcp://*:0')
results = []
find_sockets(s, '', [], results)

我找到以下套接字对象:

server_object
├─ _multiplexer
│  ├─ _events
│  │  ├ _send
│  │  │ └─ _socket
│  │  ├─ _recv
│  │  │  └─ _socket
│  │  └─ _socket
├─ _events
│  ├ _send
│  │ └─ _socket
│  ├─ _recv
│  │  └─ _socket
│  └─ _socket

绑定后,在任何这些套接字对象上调用getsockopt(zmq.LAST_ENDPOINT)会为我提供连接端点,从而为端口提供。

然而,这可能不是zeroRPC开发人员的意图,也不保证将来可以使用。因此,我现在为了连接到一个随机空闲端口而做的是获取一个随机端口,尝试绑定它,并重复这个,直到没有抛出zmq.ZMQError。