Question

J'ai un code dans une application asp.net qui needsto obtenir l'adresse ipv4 de l'ordinateur client (les utilisateurs sont tous sur notre propre réseau). Récemment, nous avons mis à niveau le serveur de l'application fonctionne sur Windows Server 2008. Maintenant, le code Request.UserHostAddress retourne le ipv4 lorsque le client est sur un ancien système d'exploitation et ipv6 quand ils sont sur une version plus récente OS (Vista et versions ultérieures). Ainsi, la fonctionnalité qui relys sur cela fonctionne pour certains clients et pas d'autres.

J'ai ajouté du code qui est censé convertir ipv6 à ipv4 pour essayer de résoudre ce problème. Il est de ce tutoriel en ligne: http://www.4guysfromrolla.com/articles/071807-1 .aspx .I'm utilisant dsn.GetHostAddress et en boucle puis à travers les adresses IP à la recherche d'un retourné qui est « InterNetwork »

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;

Le problème est que cela ne fonctionne pas pour moi. Les clients qui se connectent à partir ipv4 continuent de retourner la propriété intellectuelle ipv4 correcte de l'ordinateur client, mais les clients qui se connectent à partir de Vista et Windows 7, il renvoie le IP ipv4 du SERVEUR machine ne l'ordinateur client.

Était-ce utile?

La solution

Réponse simple: Désactiver IPV6 sur le serveur, ou supprimer l'adresse IPV6 du serveur à partir de l'entrée DNS.

Il n'y a pas de magie IPV4 <-> convertisseur IPV6. Ils sont complètement différents protocoles et adresses dans un ne se traduisent pas à l'autre. Si vous souhaitez récupérer de manière fiable l'adresse IPV4 du client, vous devez vous assurer que le client se connecte sur IPV4.

Autres conseils

J'avais aussi copié le code exemple et un collègue l'a souligné qu'il était évidemment buggy. Cette ligne utilise le nom d'hôte du serveur, d'où le résultat incorrect:

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

J'ai corrigé le code dans mon projet comme suit:

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

Le code ci-dessus fonctionne dans ASP.Net 2.0 sur Windows 7 / Server 2008. Espérons que cela aide.

si vous utilisez Net Framework 4.5 alors il existe une méthode pour convertir IP6 fournir à IP4

public IPAddress MapToIPv4()

Vous trouverez les détails

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top