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

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

2 ответа

Решение

В 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).

Отредактируйте C:\Windows\System32\drivers\etc\hosts и добавьте строку "127.0.0.1 localhost" (если его там нет, за исключением кавычек)

Другие вопросы по тегам