为什么zeromq在本地主机上不起作用?


69

该代码非常有用:

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上运行吗?

Answers:


50

问题在于:

subscriber.bind("tcp://localhost:5555")

尝试更改为:

subscriber.bind("tcp://127.0.0.1:5555")

我喜欢使用更高的地址,例如127.0.0.101,并根据每个应用程序进行更改。比IPC插座清洁。
Michael Dillon

20
@fdb是的,可以解决问题,但不能解释原因!它需要更多的解释
aculich 2012年

170

正如@fdb指出的那样:

问题在于:

subscriber.bind("tcp://localhost:5555")

尝试更改为:

subscriber.bind("tcp://127.0.0.1:5555")

但是,这值得更多解释以了解原因。

zmq_bind的文档进行了说明(粗体强调):

端点参数是由两个部分组成如下的字符串: transport://address。所述传输部分指定底层传输协议来使用。地址部分的含义特定于所选的基础传输协议。

由于您的示例使用tcp作为传输协议,因此我们在zmq_tcp文档中查找以发现(同样,粗体强调我的):

当使用带有tcp传输的zmq_bind()将本地地址分配给套接字时 ,端点应解释为接口, 后跟冒号和要使用的TCP端口号。

可以通过以下任一方式指定接口:

  • 通配符*,表示所有可用接口。
  • 数字表示形式分配给接口的主要IPv4地址。
  • 操作系统定义的接口名称。

因此,如果您不使用通配符或接口名称,则意味着您必须使用数字形式的IPv4地址(而不是DNS名称)。

注意,这仅适用于zmq_bind!另一方面,最好使用DNS名称,zmq_connect如稍后在zmq_tcp的文档中所讨论的

当使用带有tcp传输的zmq_connect()将套接字连接到对等地址时,端点应解释为对等地址,后跟冒号和要使用的TCP端口号。

可以通过以下任一方式指定对等地址:

  • 对等体的DNS名称。
  • 对等体的IPv4地址,以数字表示。

7
那是一个奇怪的实现。
huggie 2014年

一个非正交的API
RichardOD

这取决于底层的套接字API,该套接字API需要绑定到特定的网络接口(或所有接口),并且主机名->接口不是一对一映射。相反,与具有多个地址的主机名建立连接是一项明确定义的操作。
joshperry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.