In a virtual host, or when your application could run on a multiple type of OS, it could be difficult to get the IP address corresponding to your default gateway. Here a solution, which should be 'universal'. This snippets try to send a datagramme on a distant host (no matter if datagrame arrive), and retrieve the local IP with the return-value of the connect :
Socket.do_not_reverse_lookup=true def get_public_ip() UDPSocket.open do |s| s.connect '18.104.22.168', 1 # wikipedia, connection don't need to be effective s.addr.last end end
This option must be positionned :
If not, your ruby machine will try to find DNS name of wikipedia, which could take a very long time if host is isolated.