web-dev-qa-db-fra.com

SocketException: adresse incompatible avec le protocole demandé

J'essayais d'exécuter un code de serveur de socket .Net sur une machine Win7-64bit.
Je reçois toujours l'erreur suivante:

System.Net.Sockets.SocketException: une adresse incompatible avec le protocole demandé a été utilisée.
Code d'erreur: 10047

L'extrait de code est:

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;
}    

Le code ci-dessus fonctionne correctement dans Win-XP sp3.

J'ai vérifié Détails du code d'erreur sur MSDN mais cela n'a pas beaucoup de sens pour moi.

Quelqu'un a rencontré des problèmes similaires? De l'aide?

43
Amitd

Sous Windows Vista (et Windows 7), Dns.GetHostEntry renvoie également des adresses IPv6. Dans votre cas, l'adresse IPv6 (:: 1) est la première de la liste.

Vous ne pouvez pas vous connecter à une adresse IPv6 (InterNetworkV6) avec une prise IPv4 (InterNetwork).

Modifiez votre code pour créer le socket afin d'utiliser la famille d'adresses de l'adresse IP spécifiée:

Socket serverSocket =
    new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                        ↑

Remarque : Il existe un raccourci pour obtenir l'adresse IP de localhost: Vous pouvez simplement utiliser IPAddress. Bouclage (127.0.0.1) ou IPAddress.IPv6Loopback (:: 1).

87
dtb

Modifiez C:\Windows\System32\drivers\etc\hosts et ajoutez la ligne "127.0.0.1 localhost" (si ce n'est pas le cas, sans les guillemets)

2
ata