27

私はどこでも検索しましたが、それらのソリューションには何らかの形式の IP アドレスが必要です。ここに私が見つけた解決策があります。

    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

それらはすべて、誰かの IP アドレスを必要とします。他人の IP アドレスを使用しないソリューションはありますか? できれば、プラットフォームに依存しません。

4

5 に答える 5

27

これは私が何年も本番環境で使用してきたものです:

require 'socket'
ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
ip.ip_address

よく働く; aws および従来のホスティングでテスト済み

于 2016-09-07T10:19:09.893 に答える
16
require 'socket'
Socket::getaddrinfo(Socket.gethostname,"echo",Socket::AF_INET)[0][3]

実際には方法1と非常によく似ています

于 2013-01-01T18:53:01.143 に答える
1

ホストへのデフォルトのIPインターフェースなどはないため(実際にはIPインターフェースである必要はまったくありません)、名前付けに関するすべての仮定はあいまいであり、必ずしも当てはまるとは限りません。

によって返される値は、gethostname()任意のip-setupに個別に定義できるため、任意のip-addressに解決できるホスト名に関して有効なホストを反映する必要はありません。

POSIXシステムのAPIの観点から、(ip-)インターフェースの可用性をテストする唯一の信頼できる関数は、getifaddrs()すべてのインターフェースのリストとそのパラメーターを返す関数です。

Rubyの現在のSocketlibがインターフェースを提供していないように見えるので、この(http://rubygems.org/gems/system-getifaddrs)gemベースのアプローチが唯一の方法のようです。

于 2013-01-01T19:26:24.620 に答える