2010-01-11 35 views
8

Tengo un código en una aplicación asp.net que necesita obtener la dirección ipv4 de la computadora cliente (los usuarios están todos en nuestra propia red). Recientemente hemos actualizado el servidor en el que se ejecuta la aplicación al servidor de Windows 2008. Ahora el código Request.UserHostAddress devuelve el ipv4 cuando el cliente está en un sistema operativo anterior e ipv6 cuando están en un sistema operativo más nuevo (Vista y superior). Entonces la característica que se basa en esto funciona para algunos clientes y no para otros.Problema Convertir ipv6 a ipv4

Agregué un código que se supone que convierte de ipv6 a ipv4 para intentar solucionar este problema. Es a partir de este tutorial en línea: http://www.4guysfromrolla.com/articles/071807-1.aspx .I'm usando dsn.GetHostAddress y luego bucle a través de las direcciones IP devueltas buscando uno que es "Red Virtual"

foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress)) 
{ 
    if (IPA.AddressFamily.ToString() == "InterNetwork") 
    { 
     IP4Address = IPA.ToString(); 
     break; 
    } 
} 

if (IP4Address != String.Empty) 
{ 
    return IP4Address; 
} 


foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) 
{ 
    if (IPA.AddressFamily.ToString() == "InterNetwork") 
    { 
     IP4Address = IPA.ToString(); 
     break; 
    } 
} 

return IP4Address; 

El problema es que esto no está funcionando para mí. Los clientes que se conectan desde ipv4 continúan devolviendo la dirección IP IPv4 correcta de la computadora cliente, pero los clientes que se conectan desde Vista y Windows 7 devuelven la dirección IP ipv4 de la máquina SERVER, no la computadora cliente.

+8

He visto este código de muestra repetido en muchos blogs. Estoy sorprendido ya que es tan malo ... parte 1, obtener la dirección IP del cliente. Si eso falla, devuelva la dirección IP del servidor. wtf?!? –

+4

Sí, acabo de encontrar el mismo ejemplo aquí: http://www.4guysfromrolla.com/articles/071807-1.aspx. Si nada más, usar 'ToString()' para verificar la igualdad enum parece que fue escrito por un novato .NET total. – Groo

Respuesta

7

Respuesta simple: Deshabilite IPV6 en el servidor o elimine la dirección IPV6 del servidor de la entrada DNS.

No hay un mágico IPV4 < -> IPV6 convertidor. Son protocolos completamente diferentes, y las direcciones en una no se traducen en la otra. Si desea recuperar de manera confiable la dirección IPV4 del cliente, debe asegurarse de que el cliente se conecte a través de IPV4.

+6

Y, por supuesto, el consejo obvio: viene IPv6, prepare su software para manejarlo correctamente. Confiar en las direcciones IPv4 te hará daño. –

1

si está utilizando .Net 4.5 Marco continuación, hay un método para convertir proporcionar IP6 a IP4

public IPAddress MapToIPv4() 

Puede encontrar los detalles here

+4

Ese método solo tiene sentido para usar en direcciones IPv6 que se han obtenido asignando direcciones IPv4 a v6 en primer lugar. Como dice Jesse Weigert, no existe un convertidor magic v6 -> v4. – AakashM

6

También había copiado el código de ejemplo y un colega señaló que obviamente estaba lleno de errores. Esta línea utiliza el nombre de host del servidor, por lo tanto, el resultado incorrecto:

foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) 

He corregido el código en mi proyecto de la siguiente manera:

/// <summary> 
/// Returns the IPv4 address of the specified host name or IP address. 
/// </summary> 
/// <param name="sHostNameOrAddress">The host name or IP address to resolve.</param> 
/// <returns>The first IPv4 address associated with the specified host name, or null.</returns> 
public static string GetIPv4Address(string sHostNameOrAddress) 
{ 
    try 
    { 
    // Get the list of IP addresses for the specified host 
    IPAddress[] aIPHostAddresses = Dns.GetHostAddresses(sHostNameOrAddress); 

    // First try to find a real IPV4 address in the list 
    foreach (IPAddress ipHost in aIPHostAddresses) 
     if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
     return ipHost.ToString(); 

    // If that didn't work, try to lookup the IPV4 addresses for IPV6 addresses in the list 
    foreach (IPAddress ipHost in aIPHostAddresses) 
    if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) 
     { 
     IPHostEntry ihe = Dns.GetHostEntry(ipHost); 
     foreach (IPAddress ipEntry in ihe.AddressList) 
      if (ipEntry.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      return ipEntry.ToString(); 
     } 
    } 
    catch (Exception ex) 
    { 
    System.Diagnostics.Trace.WriteLine(ex); 
    } 
    return null; 
} 

El código anterior funciona en ASP.Net 2.0 en Windows 7/Server 2008. Espero que esto ayude.

+0

¿No eres fan de los brackets? :) – Evorlor

Cuestiones relacionadas