Самый простой способ проверить IP-адрес по диапазону значений с помощью C # - PullRequest
2 голосов
/ 14 декабря 2010

Мы пишем функцию, которая позволяет администратору блокировать / разрешать диапазоны IP-адресов.

Это достаточно просто сделать с помощью c #?

Я думал о том, чтобы посмотреть на каждое число [здесь]. [Здесь]. [Здесь]. [Здесь] и затем сопоставить его с диапазонами и просто посмотреть, было ли каждое число между двумя?

Будет ли это работать для стандартных адресов ip v4?

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

Я бы преобразовал их в целые числа, а затем сравнил бы целое число. Но то, что правильно, зависит от того, как вы определяете диапазоны.

UInt32 Ip4ToInt(string ip)
{
  UInt32[] parts=ip.Split('.').Select(s=>UInt32.Parse(s)).ToArray();
  if (parts.Length != 4)
    throw new ArgumentException("InvalidIP");
  return (parts[0]<<24) | (parts[1]<<16) | (parts[2]<<8) | parts[3];
}

Например, 1.1.1.99 должен быть частью диапазона 1.1.1.1 - 1.1.2.2? При сравнении каждой группы это не так, при сравнении целых это.

1 голос
/ 22 марта 2011

Я знаю, что System.Net.IPAddress.Address является устаревшим Но я думаю, что это самый простой способ:

bool result = false;

System.Net.IPAddress iStart = System.Net.IPAddress.Parse(ipStart);
System.Net.IPAddress iEnd = System.Net.IPAddress.Parse(ipEnd);
System.Net.IPAddress iIp = System.Net.IPAddress.Parse(ip);

if (iStart.Address <= iIp.Address && iEnd.Address >= iIp.Address)
{
    result = true;
}

пс.ipStart, ipEnd, ip являются строками.пример: 127.0.0.1

0 голосов
/ 14 декабря 2010
public static bool CheckIfIpValid(string allowedStartIp, string allowedEndIp, string ip)
        {
            // if both start and end ip's are null, every user with these credential can log in, no ip restriction needed.

        if (string.IsNullOrEmpty(allowedStartIp) && string.IsNullOrEmpty(allowedEndIp))
            return true;
        bool isStartNull = string.IsNullOrEmpty(allowedStartIp),
            isEndNull = string.IsNullOrEmpty(allowedEndIp);
        string[] startIpBlocks, endIpBlocks, userIp = ip.Split('.');
        if (!string.IsNullOrEmpty(allowedStartIp))
            startIpBlocks = allowedStartIp.Split('.');
        else
            startIpBlocks = "0.0.0.0".Split('.');
        if (!string.IsNullOrEmpty(allowedEndIp))
            endIpBlocks = allowedEndIp.Split('.');
        else
            endIpBlocks = "999.999.999.999".Split('.');

        for (int i = 0; i < userIp.Length; i++)
        {
            // if current block is smaller than allowed minimum, ip is not valid.
            if (Convert.ToInt32(userIp[i]) < Convert.ToInt32(startIpBlocks[i]))
                return false;
            // if current block is greater than allowed maximum, ip is not valid.
            else if (Convert.ToInt32(userIp[i]) > Convert.ToInt32(endIpBlocks[i]))
                return false;
            // if current block is greater than allowed minimum, ip is valid.
            else if ((Convert.ToInt32(userIp[i]) > Convert.ToInt32(startIpBlocks[i])) && !isStartNull)
                return true;

        }
        return true;
    }
...