2010-03-03 30 views
38

Estaba intentando ejecutar un código de servidor de socket .Net en la máquina Win7-64bit.
me siguen dando el siguiente error:SocketException: dirección incompatible con el protocolo solicitado

System.Net.Sockets.SocketException: An address incompatible with the requested protocol was used.
Error Code: 10047

El fragmento de código es:

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

El código anterior funciona bien en Win XP SP3.

He comprobado Error code details on MSDN pero no tiene mucho sentido para mí.

¿Alguien ha encontrado problemas similares? ¿Alguna ayuda?

+0

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

Respuesta

83

En Windows Vista (y Windows 7), DNS .GetHostEntry también devuelve direcciones IPv6. En su caso, la dirección IPv6 (:: 1) es la primera en la lista.

No se puede conectar a una dirección IPv6 (InterNetworkV6) con un socket IPv4 (InterNetwork).

cambiar el código para crear el socket de utilizar la familia de direcciones de la dirección IP especificada:

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

Nota: Hay un acceso directo para obtener la dirección IP del localhost: Se puede utilizar simplemente IPAddress.Loopback (127.0.0.1) o IPAddress.IPv6Loopback (:: 1).

+4

+1 ... o puede usar la familia de direcciones de IPAddress, por supuesto ... –

+1

IP v4 y v6 tienen muchas diferencias. Desde Windows 7, necesita aprender ambos ya que tienen un impacto en su programación de socket. –

+0

cualquier documento/enlace donde se enumeran estas diferencias con respecto a la programación de socket? Sería útil. – Amitd

2

Editar C: \ Windows \ System32 \ drivers \ etc \ hosts y agregue la línea "127.0.0.1 localhost" (si no está allí, sin incluir las comillas)

+3

Es una solución, pero muy recomendable. –

+0

@LexLi, ¿podría explicar por qué no se recomienda? –

+3

@NikitaSilverstruk, el código fuente en la pregunta supone innecesariamente que siempre usará IPv4. La respuesta de Ata ayuda a cumplir esta suposición, y es por eso que digo que es solo una solución. La mejor manera es seguir la respuesta aceptada. –

Cuestiones relacionadas