web-dev-qa-db-ja.com

SocketException:要求されたプロトコルと互換性のないアドレス

Win7-64bitマシンで.Netソケットサーバーコードを実行しようとしていました。
次のエラーが引き続き表示されます。

System.Net.Sockets.SocketException:要求されたプロトコルと互換性のないアドレスが使用されました。
エラーコード:10047

コードスニペットは次のとおりです。

IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
IPEndPoint ip = new IPEndPoint(ipAddress, 9989);
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
try
{
    serverSocket.Bind(ip);
    serverSocket.Listen(10);
    serverSocket.BeginAccept(new AsyncCallback(AcceptConn), serverSocket);           
}
catch (SocketException excep)
{
  Log("Native code:"+excep.NativeErrorCode);
 // throw;
}    

上記のコードは、Win-XP sp3で正常に機能します。

MSDNのエラーコードの詳細 をチェックしましたが、それはあまり意味がありません。

誰も同様の問題に遭遇しましたか?助けがありますか?

43
Amitd

Windows Vista(およびWindows 7)では、Dns.GetHostEntryもIPv6アドレスを返します。あなたの場合、IPv6アドレス(:: 1)がリストの最初にあります。

IPv4(InterNetwork)ソケットを使用してIPv6(InterNetworkV6)アドレスに接続することはできません。

コードを変更して、指定されたIPアドレスのアドレスファミリを使用するソケットを作成します。

Socket serverSocket =
    new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                        ↑

localhostのIPアドレスを取得するショートカットがあります: IPAddress.Loopback (1​​27.0.0.1)または IPAddress.IPv6Loopback (:: 1)。

87
dtb

C:\ Windows\System32\drivers\etc\hostsを編集し、行「127.0.0.1 localhost」を追加します(ない場合は引用符を除く)

2
ata