code

zeromq가 localhost에서 작동하지 않는 이유는 무엇입니까?

codestyles 2020. 11. 19. 08:16
반응형

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

반응형