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