2009-08-16 21 views
5

quiero obtener la dirección IP del cliente en un servidor TCPS en Ruby. Y (si es posible) la dirección MAC.En TCPServer (Ruby) ¿cómo puedo obtener la IP/MAC del cliente?

Por ejemplo, un servidor de tiempo en Ruby, vea el comentario.

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 

Muchas gracias!

Respuesta

5

Uso socket.addr:

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

devuelve una matriz que muestra el tipo de zócalo, el puerto, y la información de host.

En cuanto a encontrar la dirección MAC, no sé de ninguna manera que esté incorporada. Si quiere la dirección MAC local, puede usar la gema "macaddr" de Ara Howard. Si desea la dirección MAC remota, puede usar el programa de línea de comando arp y analizar su salida. Tenga en cuenta que esto solo será válido si la máquina remota está en la misma red local, ya que las direcciones MAC no se transmiten a través de redes no locales.

+0

Pero con este método devuelve la dirección del servidor, no del cliente. Quiero saber (en el servidor, para guardar un registro de las conexiones) la dirección IP de los clientes. Gracias por su respuesta! – a0rtega

+0

@ a0rtega Tanto el servidor como los objetos del cliente amplían el socket, por lo que el método '.addr' se usa para ambos. – Blake

8

de 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 hace que sea un poco más sencillo:

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