Подтвердить что ты не робот

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, но мне это не имеет смысла.

Кто-нибудь сталкивался с подобными проблемами? Любая помощь?

4b9b3361

Ответ 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" (если ее там нет, исключая кавычки)