2017-10-02 23 views
0

나는이 다음 코드 :ZMQ의 bind_to_random_port이 예상대로 작동하지 않는

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 

를 수신하고 to :

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

...

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'% (ADDR, 포트). 따라서 주소를 tcp://*:으로 지정하면 tcp://*::1234으로 끝납니다. 이중 :을 유의하십시오. 그렇게 그 대신의 코드를 수정하는 경우

: 예상대로

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

그것은 작동합니다 :

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

을이가 있습니다. 로컬에서 테스트 해본 결과 나에게 맞는 것 같습니다.