2011-01-16 6 views
0

У меня есть требование получить количество IP-адресов в диапазоне IP, идентифицированном startIP и endIP как для диапазонов IPv4, так и для IPv6.Как вычесть IP-адрес? (как IPv4, так и IPv6)

Может ли кто-нибудь указать способы, которые могут быть использованы для вычитания IP-адресов?

Количество IP-адресов будет = endIP - startIP + 1

Любые ответы высоко оценены.

+3

Вы должны уточнить немного: в нулевом приближении, вы можете просто преобразовать адрес в 32 или 128 разрядное беззнаковое целое число и вычесть эти значения. Тем не менее: это не говорит вам о том, сколько IP-адресов, назначаемых вами, вы получаете, поскольку оно подсчитывает широковещательные IP-адреса и не учитывает подсети. –

+0

Вещательные адреса или другие специальные адреса не имеют значения. Мое требование состоит в том, чтобы получить арифметическую разницу двух IP-адресов и структур данных в C#, которые могут содержать такие значения (особенно ipv6). – user412272

ответ

2

Как это?

class Program 
{ 

    static void Main(string[] args) 
    { 
     IPAddress a = new IPAddress(new byte[] { 192, 168, 11, 12 }); 
     IPAddress b = new IPAddress(new byte[] { 192, 168, 12, 12 }); 
     long diff = Difference(a, b); 
    } 

    private static Int64 ConvertToLong(IPAddress a) 
    { 
     byte[] addressBits = a.GetAddressBytes(); 
     Int64 retval = 0; 
     for (int i = 0; i < addressBits.Length; i++) 
     { 
      retval = (retval << 8) + (int)addressBits[i]; 
     } 

     return retval; 
    } 

    private static Int64 Difference(IPAddress a, IPAddress b) 
    { 
     return Math.Abs(ConvertToLong(a) - ConvertToLong(b)) - 1; 
    } 

} 
1
class Program   
{ 
static void Main(string[] args) 
    { 
     string a = "192.168.11.12"; 
     string b = "192.168.12.12"; 
     int diff = Math.Abs(IPToInt(a) - IPToInt(b)) + 1; 
    } 
int IPToInt(string IP) 
{ 
    return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(IP).GetAddressBytes(), 0)); 
}  
} 
Смежные вопросы