3

(重複する場合はこのスレッドを閉じてください。一生懸命試しましたが、一致する質問が見つかりませんでした)

一部の OS/プラットフォームは、IPv6 ウィドカード アドレスにバインドされている場合、IPv6 と IPv4 (tcp) の両方の接続をリッスンしているようですが、一部は IPv6 のみをリッスンしています。

V6Only 引数の場合

次の行で:

プラットフォームがこのオプションの無効化をサポートしていないが、それでも AF_INET と AF_INET6 の両方の接続をリッスンしたい場合は、各プロトコルにバインドされた 2 つのリッスン ソケットを作成する必要があります。

また、セクション「Java プラットフォームでの IPv6 の仕組み

そして、このSOの質問の正解に従って

ここで、基礎となる OS/プラットフォームが IPv6 と IPv4 (IPv6 にバインドされている場合) の両方をリッスンするかどうかを判断できる Perl コードを書きたいと思います。 1 つは IPv4 用、もう 1 つは IPv6 用です)。

これには何が最善の方法でしょうか?

IO::Socket::IPで述べたように、私は使用できます

if( IO::Socket::IP->CAN_DISABLE_V6ONLY ) {
    ...
}
else {
    ...
}

しかし、それが正確に教えてくれるかどうかはわかりません

基盤となる OS/プラットフォームが IPv6 と IPv4 の両方をリッスンする場合 (IPv6 にバインドされている場合)

または、単に

IPV6_V6ONLY ソケット オプションを無効にすることはできません

4

1 に答える 1

4

「IPV6_V6ONLYソケットオプションを無効にすることはできません」とだけ伝えます

正解です。

できることは、PF_INET6 ソケットの作成を試み、成功した場合は IPV6_V6ONLY ソケット オプションを確認することです。その場合、ソケットは IPv4 ではなく IPv6 でのみリッスンしているため、別のソケットを作成する必要があります。false の場合、ソケットは IPv6 と IPv4 の両方をキャプチャし、この 1 つのソケットで十分です。

于 2012-09-27T14:27:36.620 に答える