Я пытался запустить код сервера сокета .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, но для меня это не имеет особого смысла.

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

43
Amitd 3 Мар 2010 в 13:29
 – 
MaxEcho
22 Мар 2016 в 12:42

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

89
Roger Lipscombe 3 Мар 2010 в 14:48
1
IP v4 и v6 имеют много различий. Начиная с Windows 7, вам необходимо изучить и то, и другое, поскольку они влияют на программирование сокетов.
 – 
Lex Li
4 Мар 2010 в 08:23
Какие-либо документы / ссылки, в которых перечислены эти различия относительно программирования сокетов? они бы пригодились
 – 
Amitd
4 Мар 2010 в 09:48
1
Это отлично подходит для localhost, но для меня это не работает, когда это НЕ локальный хост. Любые идеи?
 – 
Tizz
17 Апр 2012 в 02:14
Как насчет этой ошибки при вызове партиала из mvc на лазурном веб-сайте? ?? я не понимаю
 – 
Bart Calixto
26 Мар 2014 в 05:30
1
Эта крошечная стрелка (↑) очень помогает.
 – 
kevinarpe
23 Мар 2017 в 07:40

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

2
ata 3 Мар 2010 в 13:37
@LexLi, не могли бы вы рассказать, почему это не рекомендуется?
 – 
Nikita Silverstruk
1 Окт 2013 в 20:45
3
@NikitaSilverstruk, исходный код в вопросе делает ненужное предположение, что он всегда будет использовать IPv4. Ответ Ata помогает выполнить это предположение, и поэтому я говорю, что это только обходной путь. Лучше всего следовать принятому ответу.
 – 
Lex Li
2 Окт 2013 в 04:07