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のエラーコードの詳細 をチェックしましたが、それはあまり意味がありません。
誰も同様の問題に遭遇しましたか?助けがありますか?
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 (127.0.0.1)または IPAddress.IPv6Loopback (:: 1)。
C:\ Windows\System32\drivers\etc\hostsを編集し、行「127.0.0.1 localhost」を追加します(ない場合は引用符を除く)