为什么zeromq不能在localhost上运行?

use*_*428 65 python localhost zeromq

这段代码效果很好:

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 )
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用:

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 )
Run Code Online (Sandbox Code Playgroud)

它引发了这个错误:

ZMQError:没有这样的设备

为什么,zeromq不能使用localhost接口?

它只适用于同一台机器上的IPC吗?

acu*_*ich 161

正如@fdb指出:

问题在于:

subscriber.bind("tcp://localhost:5555")
Run Code Online (Sandbox Code Playgroud)

尝试改为:

subscriber.bind("tcp://127.0.0.1:5555")
Run Code Online (Sandbox Code Playgroud)

然而,理解为什么这需要更多的解释.

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地址,以其数字表示形式.

  • 这是一个奇怪的实现. (6认同)

fdb*_*fdb 43

问题在于:

subscriber.bind("tcp://localhost:5555")
Run Code Online (Sandbox Code Playgroud)

尝试改为:

subscriber.bind("tcp://127.0.0.1:5555")
Run Code Online (Sandbox Code Playgroud)

  • @fdb是的,这解决了问题,但没有解释原因!它需要[更多解释](http://stackoverflow.com/a/8958414/462302). (20认同)