2010-03-03 3 views
38

J'essayais d'exécuter un code de serveur de socket .Net sur une machine Win7-64bit.
Je continue à obtenir l'erreur suivante:SocketException: adresse incompatible avec le protocole demandé

System.Net.Sockets.SocketException: An address incompatible with the requested protocol was used.
Error Code: 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 très bien dans sp3 Win-XP. J'ai vérifié Error code details on MSDN mais cela n'a pas beaucoup de sens pour moi.

Quelqu'un at-il rencontré des problèmes similaires? De l'aide?

+0

http://stackoverflow.com/a/36150831/2459296 – Salim

Répondre

83

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

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

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

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

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

+4

+1 ... ou vous pouvez utiliser la famille d'adresses de l'adresse IP, bien sûr ... –

+1

IP v4 et v6 ont beaucoup de différences. Depuis Windows 7, vous devez apprendre les deux car ils ont un impact sur la programmation de votre socket. –

+0

des documents/liens où ces différences concernant la programmation socket sont répertoriés? ils viendraient pratique – Amitd

2

Modifier C: \ Windows \ System32 \ drivers \ etc \ hosts et ajoutez la ligne "127.0.0.1 localhost" (si ce ne est pas là-bas, à l'exclusion citations)

+3

Il s'agit d'une solution de contournement, mais fortement déconseillée. –

+0

@LexLi, pourriez-vous expliquer pourquoi il n'est pas recommandé? –

+3

@ NikitaSilverstruk, le code source dans la question fait l'hypothèse inutile qu'il utilisera toujours IPv4. La réponse d'Ata aide à réaliser cette hypothèse, et c'est pourquoi je dis que c'est une solution de contournement seulement. Le meilleur moyen est de suivre la réponse acceptée. –

Questions connexes