SocketException: адрес несовместим с запрошенным протоколом
Я пытался запустить код сервера сокетов .Net на машине Win7-64bit.
Я продолжаю получать следующую ошибку:
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, но мне это не имеет смысла.
Кто-нибудь сталкивался с подобными проблемами? Любая помощь?
Ответы
Ответ 1
В Windows Vista (и Windows 7) Dns.GetHostEntry также возвращает адреса IPv6. В вашем случае адрес IPv6 (:: 1) является первым в списке.
Вы не можете подключиться к IPv6 (InterNetworkV6) адресу с помощью сокета IPv4 (InterNetwork).
Измените свой код, чтобы создать сокет, чтобы использовать семейство адресов указанного IP-адреса:
Socket serverSocket =
new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
↑
Примечание: есть ярлык для получения IP-адреса localhost: вы можете просто использовать IPAddress.Loopback ( 127.0.0.1) или IPAddress.IPv6Loopback (:: 1).
Ответ 2
Отредактируйте C:\Windows\System32\drivers\etc\hosts и добавьте строку "127.0.0.1 localhost" (если ее там нет, исключая кавычки)