在TCPServer(Ruby)中,我如何从客户端获取IP/MAC地址?

5
我希望在Ruby的TCPServer中获取客户端的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

非常感谢您!
2个回答

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"

Ruby 1.9使得这个过程更加简单:

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

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

它返回一个数组,显示套接字类型、端口和主机信息。
关于查找MAC地址,我不知道是否有内置的方法。如果你想要本地MAC地址,可以使用Ara Howard的“macaddr”宝石。如果你想要远程MAC地址,可以使用命令行arp程序并解析其输出。请注意,这只在远程计算机位于同一局域网上时才有效,因为MAC地址不会跨越非本地网络传输。

但是使用这种方法它返回的是服务器的地址,而不是客户端的地址。我想知道(在服务器中,以保存连接日志)客户端的IP。 感谢您的回答! - a0rtega
@a0rtega 服务器和客户端对象都扩展了socket,因此.addr方法适用于两者。 - Blake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接