1

ソケットがどのように機能するかを知りたかったので、HOWTOドキュメントをざっと読み、独自のコードを作成しようとしました。サーバー側は次のようになります。

ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
assert socket.gethostname() == HOST
ssock.bind((HOST, PORT))
ssock.listen(5)
while True:
    csock, address = ssock.accept()
    print('Accepted connection from', address)
    t = threading.Thread(target=server, args=(csock,))
    t.start()

クライアント側は次のとおりです。

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

これらは 1 つのモジュールにあるため、定数は同じです。これはうまくいきません。接続しようとすると、ConnectionRefusedError: [Errno 111] Connection refused.

ただし

  1. ホスト名を介して別のポートに接続しようとすると、次のように機能します。

    In [4]: s.connect((HOST, 22))
    
    In [5]: s.recv(1024)
    Out[5]: b'SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1\r\n'
    

    (明らかに、サーバー上の接続を処理するのは私のアプリではありません)。

  2. サーバー コードでホスト名をローカル IP アドレスに変更すると、ポートにも接続できます (IP をホスト文字列として使用)。

これらの状況の組み合わせは、私を困惑させます。誰でもこの動作を説明できますか?

編集:HOSTサーバーコードでもIPを使用すると接続できるようです。しかし、HOWTO のように機能しないのはなぜですか?

4

1 に答える 1

5

HOSTの代わりに""にバインドします。

ssock.bind(("", PORT))
于 2013-02-03T17:08:29.920 に答える