4

次のコードを試して、コードをデュアル スタック モードで動作させました。残念ながら、デュアル スタック モードではポートを開放していません。

var listener = new TcpListener(IPAddress.Any, 2222);
listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0);
listener.Start();

var listener = new TcpListener(IPAddress.IPv6Any, 2222);後で、に変更するとうまくいくことに気付きました。正確にはどのような違いがありますか

IPAddress.AnyIPAddress.IPv6Anyフィールド?

MSDN のドキュメントは少しあいまいです

4

2 に答える 2

11

IPAddress.Anyはすべての IPv4 インターフェイス用、IPAddress.IPv6Anyはすべての IPv6 インターフェイス用です。

IPAddress.Any0.0.0.0IPAddress.IPv6Anyです::

IPv6Any を使用せずに使用するだけの場合SocketOptionName.IPv6Only、同じソケットで IPv4 と IPv6 の両方の接続を受け入れることができます。

于 2013-04-30T13:07:29.473 に答える
6

IPv4 と IPv6 の両方のスタックでリッスンするには、次のコードを使用します。

var listener = new TcpListener(IPAddress.IPv6Any, 2222);
listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);

IPv6AnyIPv6 スタックでリッスンするように Windows に指示します。ソケット オプションを false に設定すると、Windows は IPv6 スタックに制限されず、IPv4 スタックでもリッスンするようになります。デフォルトでは、明示的に指定されたスタックでのみリッスンします。

于 2015-02-02T15:49:32.157 に答える