确定给定的IP地址是否在网络阵列中

时间:2013-07-01 15:10:31

标签: ruby arrays networking

我正在尝试确定给定的IP是否在网络阵列中。对include?个对象数组使用IPAddr似乎不起作用(if条件永远不会满足),例如:

require 'ipaddr'

my_ipaddr = IPAddr.new("192.168.10.102")

# define our internal networks
internal = [IPAddr.new("192.168.50.1/24"), IPAddr.new("192.168.10.1/24")]

if internal.include?(my_ipaddr)
    puts "I'm in the internal network"
end

但是,如果我定义一个没有数组的网络,它可以很好地工作:

internal = IPAddr.new("192.168.10.1/24")

如果您需要更多信息,请与我们联系。我是红宝石的新手,所以请善待:)。

2 个答案:

答案 0 :(得分:4)

您要求Ruby查看数组中的任何对象是否与IP地址匹配,而不是。 IP网络与主机IP不同。

相反,您必须将主机IP与单个IP范围进行比较,看看它是否包含在内。

请参阅IPAddr类中的include?

internal.any? { |i| i.include?(my_ipaddr) }

Enumerable的any?返回true / false。使用find代替第一个:

internal.find { |i| i.include?(my_ipaddr) }

如果您正在进行大量IP地址操作或子网划分,请查看IPAddress gem。真的很好。

答案 1 :(得分:2)

IPAddr类有自己的include?方法非常Array#include?不同

http://www.ruby-doc.org/stdlib-2.0/libdoc/ipaddr/rdoc/IPAddr.html#method-i-include-3F

当您说internal.include?时,您实际上正在调用Array#include?来测试对象相等性。显然这些不是同一个对象,因此比较失败。

您真正想要的是查看IPAddr对象include? <{1}}对象

my_ipaddr