【问题标题】:Python ZeroMQ REQ/REP client bind waiting foreverPython ZeroMQ REQ/REP 客户端绑定永远等待
【发布时间】:2012-11-14 13:08:50
【问题描述】:

我只是在 python 中为一个项目尝试 zeromq。我正在尝试绑定“客户端”并将服务器连接到固定位置。我有一个简单的 REQ/REP 设置,可以在本地正常工作,但似乎在网络上什么也没做。如果我反转绑定,那么这也适用于网络。

相关代码为:

def respond(sock):
    message = sock.recv()
    response = "world"
    sock.send(response)
    print("Received '{0:s}', sent '{1:s}'.".format(message, response) )

def request(sock):
    message = "Hello"
    sock.send(message)
    response = sock.recv()
    print("Sent '{0:s}', recieved '{1:s}'".format(message, response) )

def main():
    opts = get_opts()
    if opts.client:
        sock = CONTEXT.socket(zmq.REQ)
        sock.bind("tcp://*:{0:d}".format(opts.port) )
        request(sock)
    if opts.server:
        sock = CONTEXT.socket(zmq.REP)
        sock.connect("tcp://{0:s}:{1:d}".format(opts.address, opts.port) )
        while True:
            respond(sock)

这里有一个(非)工作示例:https://gist.github.com/4071783

连接到远程地址时,似乎什么也没有发生。如果我检查 tcpdump,我当然可以看到端口上的活动:

12:20:18.846927 IP server.58387 > client.5555: Flags [.], ack 1, win 3650, options [nop,nop,TS val 718051 ecr 46170252], length 0
12:20:18.847156 IP client.5555 > server.58387: Flags [P.], seq 1:3, ack 1, win 227, options [nop,nop,TS val 46170252 ecr 718051], length 2
12:20:18.847349 IP server.58387 > client.5555: Flags [P.], seq 1:3, ack 1, win 3650, options [nop,nop,TS val 718051 ecr 46170252], length 2
12:20:18.847373 IP client.5555 > server.58387: Flags [.], ack 3, win 227, options [nop,nop,TS val 46170252 ecr 718051], length 0
12:20:18.847553 IP client.5555 > server.58387: Flags [P.], seq 3:16, ack 3, win 227, options [nop,nop,TS val 46170252 ecr 718051], length 13
12:20:18.847645 IP server.58387 > client.5555: Flags [.], ack 3, win 3650, options [nop,nop,TS val 718051 ecr 46170252], length 0
12:20:18.848286 IP server.58387 > client.5555: Flags [.], ack 16, win 3650, options [nop,nop,TS val 718051 ecr 46170252], length 0

但是send()recv() 仍然被阻塞,就像在等待连接一样。有谁知道这是什么或可以建议如何调试它?

【问题讨论】:

  • 事实上,我只是重新测试了 zguide 示例,而 hwserver/client 示例也只在一个方向上起作用。在我的一台机器上托管服务器会导致客户端和服务器永远等待。

标签: python zeromq


【解决方案1】:

你能ping通远程地址吗? 0MQ 只是在这个级别使用 TCP,所以如果连接失败,那是因为您尝试连接的地址不可达。

【讨论】:

  • 我可以反向连接成功。 IE。 machineB 可以绑定并让 machineA 连接到它。但是,这对我的应用程序没有任何意义。我希望 machineA 绑定和 machineB 连接到 machineAs 地址。当我尝试这个时,我看到 TCP 流量正常(请参阅问题中的 TCPdump)但 0MQ 似乎从未收到它。 - 如果有帮助,machineA 是运行 pyzmq==2.2.0.1 的 RaspberryPi,machineB 是运行 pyzmq==2.1.9 的笔记本电脑
  • 你没有告诉我“ping”是否适用于远程地址。
  • 对不起,是的:machineA 可以ping machineB 的地址,machineB 可以ping machineA 的地址。
  • 因此,如果 ping 有效但连接无效,则可能是防火墙或 NAT 问题。 IE。入站连接未传递给绑定其套接字的对等方。
猜你喜欢
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2014-01-03
  • 1970-01-01
  • 2020-07-17
  • 2013-06-07
相关资源
最近更新 更多