9

asp.netアプリに、クライアントコンピューターのipv4アドレスを取得する必要のあるコードがあります(ユーザーはすべて独自のネットワーク上にあります)。最近、アプリを実行するサーバーをWindows2008サーバーにアップグレードしました。これで、Request.UserHostAddressコードは、クライアントが古いOSを使用している場合はipv4を返し、新しいOS(Vista以降)を使用している場合はipv6を返します。したがって、これに依存する機能は、一部のクライアントでは機能し、他のクライアントでは機能しません。

この問題を解決するために、ipv6からipv4に変換することになっているコードを追加しました。これは、このオンラインチュートリアルからのものです:http: //www.4guysfromrolla.com/articles/071807-1.aspx。私はdsn.GetHostAddressを使用していて、返されたIPをループして、「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;

問題は、これがうまくいかないことです。ipv4から接続しているクライアントは、引き続きクライアントコンピューターの正しいipv4 IPを返しますが、VistaおよびWindows 7から接続しているクライアントは、クライアントコンピューターではなくSERVERマシンのipv4IPを返します。

4

3 に答える 3

7

簡単な答え:サーバーでIPV6を無効にするか、DNSエントリからサーバーのIPV6アドレスを削除します。

魔法のIPV4<->IPV6コンバーターはありません。これらは完全に異なるプロトコルであり、一方のアドレスが他方に変換されません。クライアントのIPV4アドレスを確実に取得する場合は、クライアントがIPV4経由で接続していることを確認する必要があります。

于 2010-02-17T03:36:51.200 に答える
7

また、サンプルコードをコピーしたところ、同僚が明らかにバグがあると指摘しました。この行はサーバーのホスト名を使用しているため、誤った結果になります。

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

プロジェクトのコードを次のように修正しました。

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

上記のコードは、Windows 7 /Server2008のASP.Net2.0で機能します。これがお役に立てば幸いです。

于 2013-08-29T06:19:25.803 に答える
1

.Net 4.5 Frameworkを使用している場合は、IP6をIP4に変換する方法があります。

public IPAddress MapToIPv4()

あなたはここで詳細を見つけることができます

于 2013-03-14T07:39:41.443 に答える