zeromq가 localhost에서 작동하지 않는 이유는 무엇입니까?
이 코드는 훌륭하게 작동합니다.
import zmq, json, time
def main():
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.bind("ipc://test")
subscriber.setsockopt(zmq.SUBSCRIBE, '')
while True:
print subscriber.recv()
def main():
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.connect("ipc://test")
while True:
publisher.send( "hello world" )
time.sleep( 1 )
그러나이 코드 는 작동 하지 않습니다 .
import zmq, json, time
def recv():
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.bind("tcp://localhost:5555")
subscriber.setsockopt(zmq.SUBSCRIBE, '')
while True:
print subscriber.recv()
def send():
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.connect("tcp://localhost:5555")
while True:
publisher.send( "hello world" )
time.sleep( 1 )
이 오류가 발생합니다.
ZMQError : 해당 장치 없음
왜 zeromq는 localhost 인터페이스를 사용할 수 없습니까?
동일한 시스템의 IPC에서만 작동합니까?
문제는 다음과 같습니다.
subscriber.bind("tcp://localhost:5555")
다음으로 변경하십시오.
subscriber.bind("tcp://127.0.0.1:5555")
@fdb가 지적했듯이 :
문제는 다음과 같습니다.
subscriber.bind("tcp://localhost:5555")
다음으로 변경하십시오.
subscriber.bind("tcp://127.0.0.1:5555")
그러나 이것은 이유를 이해하기 위해 더 많은 설명이 필요합니다.
zmq_bind에 대한 문서는 설명합니다 (굵게 강조) :
엔드 포인트 인수는 다음과 같이 두 부분으로 구성된 문자열입니다
transport://address
. 전송 부분은 사용에 기본 전송 프로토콜을 지정합니다. 주소 부분 의 의미는 선택한 기본 전송 프로토콜에 따라 다릅니다.
Since your example uses tcp as the transport protocol we look in the zmq_tcp documentation to discover (again, bold emphasis mine):
When assigning a local address to a socket using zmq_bind() with the tcp transport, the endpoint shall be interpreted as an interface followed by a colon and the TCP port number to use.
An interface may be specified by either of the following:
- The wild-card *, meaning all available interfaces.
- The primary IPv4 address assigned to the interface, in its numeric representation.
- The interface name as defined by the operating system.
So, if you're not using wild-card or the interface name, then it means you must use an IPv4 address in numeric form (not a DNS name).
Note, this only applies to the use of zmq_bind
! On the other hand it is perfectly fine to use a DNS name with zmq_connect
as discussed later in the docs for zmq_tcp:
When connecting a socket to a peer address using zmq_connect() with the tcp transport, the endpoint shall be interpreted as a peer address followed by a colon and the TCP port number to use.
A peer address may be specified by either of the following:
- The DNS name of the peer.
- The IPv4 address of the peer, in its numeric representation.
참고URL : https://stackoverflow.com/questions/6024003/why-doesnt-zeromq-work-on-localhost
'code' 카테고리의 다른 글
mvc : favicon.ico도 컨트롤러를 찾습니까? (0) | 2020.11.20 |
---|---|
방랑 할 수 있도록 포트 8080을 사용하는 프로세스를 어떻게 죽일 수 있습니까? (0) | 2020.11.19 |
PictureBox에 대한 투명한 제어 (0) | 2020.11.19 |
MySQL JOIN과 LEFT JOIN의 차이점 (0) | 2020.11.19 |
오류 LNK2005, 이미 정의 되었습니까? (0) | 2020.11.19 |