1


0

IPv6アドレスを持つSocket.Connectが「アドレスファミリはサポートされていません」エラーをスローする

Socket.Connect()を実行しようとしていますが、指定したIPアドレスがipv6形式の場合、Socket.Connect()はエラーメッセージで失敗します。

  • http://msdn.microsoft.com/en-us/library/ms740668%28VS.85%29.aspx [プロトコルファミリでサポートされていないアドレスファミリ]。*要求されたプロトコルと互換性のないアドレスが使用されました。 すべてのソケットは、関連付けられたアドレスファミリ(つまり、インターネットプロトコルのAF_INET)と汎用プロトコルタイプ(つまり、SOCK_STREAM)で作成されます。 このエラーは、誤ったプロトコルがソケット呼び出しで明示的に要求された場合、または間違ったファミリのアドレスがソケットに使用された場合(たとえば、sendto)に返されます。

ただし、以下のスニペットのコードのコメントを解除すると、ipv4アドレスが接続に使用され、呼び出しが成功します。 hostadd.AddressList [0]はipv6アドレスを返すことに注意してください。 また、ipv4とipv6の両方が有効になっているWindows 7 64ビットマシン間で接続しています。

ipv6アドレスを使用して接続するとエラーがスローされるのはなぜですか? Socket.Connect()メソッドhttp://msdn.microsoft.com/en-us/library/d7ew360f.aspx[documents]以下のこと:

_ IPv6が有効で、Connect(String、Int32)メソッドが呼び出されて、IPv6アドレスとIPv4アドレスの両方に解決されるホストに接続する場合、IPv4アドレスの前にIPv6アドレスへの接続が最初に試行されます。 これは、ホストがIPv6アドレスをリッスンしていない場合、接続を確立する時間を遅らせる効果があります。IPv6アドレスをリッスンしていない場合。 _

                IPHostEntry hostadd = Dns.GetHostEntry(TimeServer);
                IPAddress ip4IP = hostadd.AddressList[0];
                //foreach (IPAddress ipAddress in hostadd.AddressList) {
                //    if (ipAddress.AddressFamily == AddressFamily.InterNetwork) {
                //        ip4IP = ipAddress;
                //        break;
                //    }
                //}
                IPEndPoint EPhost = new IPEndPoint(ip4IP, 123);

                Socket pSocket = new Socket(
                    AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                pSocket.ReceiveTimeout = 2000;
                pSocket.SendTimeout = 2000;
                pSocket.Connect(EPhost);

1 Answer


2


Socket()呼び出しでIPv4を指定しているようです。 「InterNetwork」の代わりに「InterNetworkV6」を使用してみましたか? 私の経験では、(少なくともCソケットでは)IPv6ソケットはIPv4アドレスとIPv6アドレスの両方をサポートしますが、IPv4ソケットはIPv4のみをサポートします。