I have searched everywhere but their solution requires some form of IP address. Here are the solutions i have found.
require 'socket'
#METHOD 1
ip = IPSocket.getaddress(Socket.gethostname)
puts ip
#METHOD 2
host = Socket.gethostname
puts host
#METHOD 3(uses Google's address)
ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}
puts ip
#METHOD 4(uses gateway address)
def local_ip
orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily
UDPSocket.open do |s|
s.connect '192.168.1.1', 1
s.addr.last
end
ensure
Socket.do_not_reverse_lookup = orig
end
ip=local_ip
puts ip
All of them require IP address of someone. Is there a solution that does not use someone else's IP address? Preferably, platform independent.
Isn't the solution you are looking for just:
require 'socket'
addr_infos = Socket.ip_address_list
Since a machine can have multiple interfaces and multiple IP Addresses, this method returns an array of Addrinfo.
You can fetch the exact IP addresses like this:
addr_infos.each do |addr_info|
puts addr_info.ip_address
end
You can further filter the list by rejecting loopback and private addresses, as they are usually not what you're interested in, like so:
addr_infos.reject( &:ipv4_loopback? )
.reject( &:ipv6_loopback? )
.reject( &:ipv4_private? )