1. ホーム
  2. c#

入力されたIPが特定のIP範囲に入ることを確認する方法

2023-10-25 08:21:41

質問

172.16.11.5 - 100 のようないくつかの IP 範囲をユーザーに入力させる場合、IP (172.16.11.50) が範囲に含まれるかどうかをチェックする関数はどのように書けばよいでしょうか?

.NETで活用できる既存のライブラリはありますか?

どのように解決するのですか?

フレームワークに組み込まれたものはありませんが IPAddressRange クラスを作成するのにそれほど苦労はしないでしょう。

を呼び出して範囲を比較することになります。 IPAddress.GetAddressBytesを呼び出すことで比較します。 を呼び出して比較します。最初のバイトから始めて、比較アドレスが上位/下位アドレスの範囲にあるかどうかをチェックします。

この方法は、IPv4とIPv6の両方のアドレスに対して機能します。

public class IPAddressRange
{
    readonly AddressFamily addressFamily;
    readonly byte[] lowerBytes;
    readonly byte[] upperBytes;

    public IPAddressRange(IPAddress lowerInclusive, IPAddress upperInclusive)
    {
        // Assert that lower.AddressFamily == upper.AddressFamily

        this.addressFamily = lowerInclusive.AddressFamily;
        this.lowerBytes = lowerInclusive.GetAddressBytes();
        this.upperBytes = upperInclusive.GetAddressBytes();
    }

    public bool IsInRange(IPAddress address)
    {
        if (address.AddressFamily != addressFamily)
        {
            return false;
        }

        byte[] addressBytes = address.GetAddressBytes();

        bool lowerBoundary = true, upperBoundary = true;

        for (int i = 0; i < this.lowerBytes.Length && 
            (lowerBoundary || upperBoundary); i++)
        {
            if ((lowerBoundary && addressBytes[i] < lowerBytes[i]) ||
                (upperBoundary && addressBytes[i] > upperBytes[i]))
            {
                return false;
            }

            lowerBoundary &= (addressBytes[i] == lowerBytes[i]);
            upperBoundary &= (addressBytes[i] == upperBytes[i]);
        }

        return true;
    }
}

注:上記のコードは、パブリックな静的ファクトリーメソッドを追加するために拡張することができます。 FromCidr(IPAddress address, int bits)