ソケットがどのように機能するかを知りたかったので、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
.
ただし:
ホスト名を介して別のポートに接続しようとすると、次のように機能します。
In [4]: s.connect((HOST, 22)) In [5]: s.recv(1024) Out[5]: b'SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1\r\n'
(明らかに、サーバー上の接続を処理するのは私のアプリではありません)。
サーバー コードでホスト名をローカル IP アドレスに変更すると、ポートにも接続できます (IP をホスト文字列として使用)。
これらの状況の組み合わせは、私を困惑させます。誰でもこの動作を説明できますか?
編集:HOST
サーバーコードでもIPを使用すると接続できるようです。しかし、HOWTO のように機能しないのはなぜですか?