Saltar al contenido

Descubra si una IP está dentro de un rango de IP

Posterior a de una larga búsqueda de datos pudimos solucionar este apuro que pueden tener muchos los lectores. Te regalamos la solución y nuestro deseo es que te resulte de mucha ayuda.

Solución:

>> require "ipaddr"
=> true
>> low = IPAddr.new("62.0.0.0").to_i
=> 1040187392
>> high = IPAddr.new("62.255.255.255").to_i
=> 1056964607
>> ip = IPAddr.new("62.156.244.13").to_i
=> 1050473485
>> (low..high)===ip
=> true

Si se le proporciona la red en lugar de las direcciones de inicio y finalización, es aún más simple

>> net = IPAddr.new("62.0.0.0/8")
=> #
>> net===IPAddr.new("62.156.244.13")
=> true

IPAddr también funcionará con direcciones IPv6

>> low = IPAddr.new('1::')
=> #
>> high = IPAddr.new('2::')
=> #
>> (low..high)===IPAddr.new('1::1')
=> true

Usaría esta pequeña función asesina para convertir las direcciones IP en números enteros y luego compararlas.

def ip_addr_in_range?(low, high, addr)
  int_addr = numeric_ip(addr)
  int_addr <= numeric_ip(high) && int_addr >= numeric_ip(low)
end

def numeric_ip(ip_str)
  ip_str.split('.').inject(0)  ( ip_num << 8 ) + part.to_i 
end

def test_ip_addr_in_range(low, high, addr, expected)
  result = ip_addr_in_range?(low, high, addr)
  puts "#addr #(expected ? 'should' : 'should not') be within #low and #high: #(expected == result ? 'PASS' : 'FAIL')"
end


test_ip_addr_in_range("192.168.0.0", "192.168.0.255", "192.168.0.200", true)
test_ip_addr_in_range("192.168.0.0", "192.168.0.155", "192.168.0.200", false)
test_ip_addr_in_range("192.168.0.0", "192.168.255.255", "192.168.100.200", true)
test_ip_addr_in_range("192.168.0.0", "192.168.100.255", "192.168.150.200", false)
test_ip_addr_in_range("192.168.255.255", "192.255.255.255", "192.200.100.100", true)
test_ip_addr_in_range("192.168.255.255", "192.255.255.255", "192.100.100.100", false)
test_ip_addr_in_range("192.168.255.255", "255.255.255.255", "200.200.100.100", true)
test_ip_addr_in_range("192.168.255.255", "255.255.255.255", "180.100.100.100", false)

$ ruby ip_range.rb
192.168.0.200 should be within 192.168.0.0 and 192.168.0.255: PASS
192.168.0.200 should not be within 192.168.0.0 and 192.168.0.155: PASS
192.168.100.200 should be within 192.168.0.0 and 192.168.255.255: PASS
192.168.150.200 should not be within 192.168.0.0 and 192.168.100.255: PASS
192.200.100.100 should be within 192.168.255.255 and 192.255.255.255: PASS
192.100.100.100 should not be within 192.168.255.255 and 192.255.255.255: PASS
200.200.100.100 should be within 192.168.255.255 and 255.255.255.255: PASS
180.100.100.100 should not be within 192.168.255.255 and 255.255.255.255: PASS

Hay un metodo #include?

Y puedes hacer solo:

IPAddr.new("127.0.0.1/8").include? "127.1.10.200"

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *