【问题标题】:Find out bound ports of zerorpc server找出zerorpc服务器的绑定端口
【发布时间】:2014-11-28 10:34:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: port rpc zeromq


    【解决方案1】:

    为了找到套接字对象,我编写了一个函数,递归搜索 vars(server_object) 中的任何 ZMQ 对象:

    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。

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 2017-09-19
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多