2009-08-16 11 views
5

Voglio ottenere l'indirizzo IP del client in un TCPServer in Ruby. E (se è possibile) l'indirizzo MAC.In TCPServer (Ruby) come posso ottenere l'IP/MAC dal client?

Ad esempio, un server orario in Ruby, vedere il commento.

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 

Grazie mille!

risposta

5

Uso socket.addr:

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

Si restituisce una matrice che mostra il tipo di presa, il porto, e le informazioni dell'ospite.

Per quanto riguarda la ricerca dell'indirizzo MAC, non so se è integrato. Se si desidera l'indirizzo MAC locale, è possibile utilizzare la gemma "macaddr" di Ara Howard. Se si desidera l'indirizzo MAC remoto, è possibile utilizzare il programma arp della riga di comando e analizzare l'output. Si noti che questo sarà valido solo se la macchina remota si trova sulla stessa rete locale, poiché gli indirizzi MAC non vengono trasmessi attraverso reti non locali.

+0

Ma con questo metodo restituisce l'indirizzo del server, non di cliente. Voglio sapere (nel server, per salvare un log delle connessioni) l'IP dei client. Grazie per la risposta! – a0rtega

+0

@ a0rtega sia il server che gli oggetti client estendono il socket, quindi il metodo '.addr' è usato per entrambi. – Blake

8

Rubino 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 rende un po 'più semplice:

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