2009-08-16 150 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"