web-dev-qa-db-ja.com

IP 0.0.0.0への接続は成功します。どうやって?どうして?

ローカルホストのポートにサービスを提供しており、ポートが利用可能かどうかを別のプロセスでチェックインしたいと考えています。コードのバグにより、実際にはIPに接続しようとしています0.0.0.0:<port>、そして何らかの理由で成功します-straceが証明するように:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

どういう意味ですか?なぜ機能するのですか?

41
erikbwork

ターゲットアドレスとしての0.0.0.0は、ルーティングできないホストまたは "this Host" をさまざまに参照します。実際には、0.0.0.0に接続することは、localhostに接続することと同じです。 (厳密に言うと、宛先アドレスとしては無効であり、送信元アドレスとしてのみ有効ですが、実際は理論と一致しません。)

バインドすると、「このホスト」は「このホストの任意のアドレス」に展開されます。そのため、アプリケーションは通常、0.0.0.0にバインドすることで接続を受け入れます。つまり、システム上の任意のIPv4アドレスにアドレス指定されたパケットを受信します。

69
Stephen Kitt