【问题标题】:In TCPServer (Ruby) how can i get the IP/MAC from the client?在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC?
【发布时间】:2010-11-20 00:34:22
【问题描述】:

我想在 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

非常感谢!

【问题讨论】:

    标签: ruby sockets ip-address mac-address


    【解决方案1】:

    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"
    

    【讨论】:

      【解决方案2】:

      使用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 地址不会跨非本地网络传输。

      【讨论】:

      • 但是这个方法返回的是服务器的地址,而不是客户端的地址。我想知道(在服务器中,保存连接日志)客户端的 IP。感谢您的回答!
      • @a0rtega 服务端和客户端对象都扩展了套接字,所以.addr 方法用于两者。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2016-08-31
      • 2013-11-09
      • 2013-11-02
      • 2012-03-31
      • 2019-07-12
      • 1970-01-01
      相关资源
      最近更新 更多