2009-08-16 36 views
5

我想在Ruby中的TCPServer中獲取客戶端的IP地址。並且(如果可能的話)MAC地址。在TCPServer(Ruby)中,我如何從客戶端獲取IP/MAC?

例如,Ruby中的時間服務器,請參閱評論。

tcpserver = TCPServer.new("", 80) 
if tcpserver 
puts "Listening" 
loop do 
    socket = tcpserver.accept 
    if socket 
    Thread.new do 
    puts "Connected from" + # HERE! How can i get the IP Address from the client? 
    socket.write(Time.now.to_s) 
    socket.close 
    end 
    end 
end 
end 

非常感謝!

回答

5

使用socket.addr

irb(main):011:0> socket.addr 
=> ["AF_INET", 50000, "localhost", "127.0.0.1"] 

它返回表示插座,端口的類型的數組,並且主機的信息。

關於尋找MAC地址,我不知道是否有內置的。如果你想要本地MAC地址,你可以使用Ara Howard的「macaddr」gem。如果您想要遠程MAC地址,則可以使用命令行arp程序並解析其輸出。請注意,只有當遠程計算機位於同一本地網絡時,纔會有效,因爲MAC地址不會通過非本地網絡傳輸。

+0

但該方法返回而不是客戶端的服務器的地址。我想知道(在服務器中,保存連接的日誌)客戶端的IP。 感謝您的回答! – a0rtega 2009-08-16 21:59:24

+0

@ a0rtega服務器和客戶端對象都擴展套接字,所以兩者都使用'.addr'方法。 – Blake 2014-09-08 08:19:37

8

的Ruby 1.8.7:

>> fam, port, *addr = socket.getpeername.unpack('nnC4') 
=> [4098, 80, 209, 191, 122, 70] 
>> addr 
=> [209, 191, 122, 70] 
>> addr.join('.') 
=> "209.191.122.70" 

紅寶石1.9使得它更有點直白:

>> port, ip = Socket.unpack_sockaddr_in(socket.getpeername) 
=> [80, "209.191.122.70"] 
>> ip 
=> "209.191.122.70"