3

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()は接続を待っているかのようにまだブロックされています。誰かがこれが何であるかを知っていますか、それをデバッグする方法を提案できますか?

4

1 に答える 1

1

リモート アドレスに ping を実行できますか? 0MQ はこのレベルで TCP を使用しているだけなので、接続に失敗した場合は、接続しようとしているアドレスに到達できないためです。

于 2012-11-21T06:22:54.273 に答える