views:

545

answers:

2

Hi, i want to get the IP Address of the client in a TCPServer in Ruby. And (if it is possible) the MAC Address.

For example, a Time Server in Ruby, see the comment.

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

Thank you very much!

+2  A: 

Use socket.addr:

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

It returns an array showing the type of socket, the port, and the host information.

Regarding finding the MAC address, I don't know of anyway that's built in. If you want the local MAC address, you can use Ara Howard's "macaddr" gem. If you want the remote MAC address, you can use the command line arp program and parse its output. Note that this will only be valid if the remote machine is on the same local network, as MAC addresses are not transmitted across non-local networks.

ctennis
But with this method it returns the address of the server, not of the client. I want to know (in the server, to save a log of the connections) the IP of the clients.Thanks for your answer!
a0rtega
+1  A: 

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 makes it a little more straightforward:

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