ZMQ bind_to_random_port未按预期工作

时间:2017-10-02 00:32:02

标签: python-3.x pyzmq

我有以下代码:

context = zmq.Context()
socket = context.socket(zmq.PAIR)

communication_string = "{protocol}".format(protocol='tcp://*:')

port = socket.bind_to_random_port(communication_string, min_port=2000, max_port=8000)

print(port)

while True:
    socket.send_string("Server message to client3")
    time.sleep(1)

我收到了例外

Traceback (most recent call last):
  File "C:/Users/asaxena/Desktop/communciationExperiments/pair/tr.py", line 14, in <module>
port = socket.bind_to_random_port(communication_string, min_port=2000, max_port=8000)
  File "C:\Users\asaxena\AppData\Local\Continuum\Miniconda3\lib\site-packages\zmq\sugar\socket.py", line 256, in bind_to_random_port
self.bind('%s:%s' % (addr, port))
  File "zmq/backend/cython/socket.pyx", line 495, in zmq.backend.cython.socket.Socket.bind (zmq\backend\cython\socket.c:5653)
  File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc (zmq\backend\cython\socket.c:10014)
raise ZMQError(errno)
zmq.error.ZMQError: No such device

然而,当我编写以下代码时,一切都按照我的预期进行:

port = "5556"
context = zmq.Context()
socket = context.socket(zmq.PAIR)

socket.bind("tcp://*:%s" % port)
while True:
    socket.send_string("Server message to client3")
    time.sleep(1)

谁能告诉我我做错了什么。这里的文档似乎没什么帮助。函数bind_to_random_port应该找到一个由系统分配的开放端口并使用它,但这样做不正常。

1 个答案:

答案 0 :(得分:1)

如果你看一下你问题中的追溯......

File "C:\Users\asaxena\AppData\Local\Continuum\Miniconda3\lib\site-packages\zmq\sugar\socket.py", 
line 256, in bind_to_random_port
  self.bind('%s:%s' % (addr, port))

您可以看到zmq模块正在使用'%s:%s'%(addr,port)构建连接字符串。因此,如果您将地址tcp://*:传递给它,那么您最终会得到tcp://*::1234。请注意双:

如果您修改代码而不是:

communication_string = "{protocol}".format(protocol='tcp://*:')

你有这个:

communication_string = "{protocol}".format(protocol='tcp://*')

它应该按预期工作。我在本地进行了测试,它似乎对我有用。

相关问题