2009-08-16 3 views
5

Je veux obtenir l'adresse IP du client dans un serveur TCPS dans Ruby. Et (si c'est possible) l'adresse MAC.Dans TCPServer (Ruby), comment puis-je obtenir l'IP/MAC du client?

Par exemple, un serveur de temps dans Ruby, voir le commentaire.

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 

Merci beaucoup!

Répondre

5

utilisation socket.addr:

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

Elle retourne un tableau indiquant le type de prise de courant, le port et les informations de l'hôte.

En ce qui concerne la recherche de l'adresse MAC, je ne sais pas de toute façon qui est intégré. Si vous voulez l'adresse MAC locale, vous pouvez utiliser "macaddr" gem Ara Howard. Si vous voulez l'adresse MAC distante, vous pouvez utiliser la ligne de commande arp et analyser sa sortie. Notez que ceci ne sera valide que si la machine distante est sur le même réseau local, car les adresses MAC ne sont pas transmises sur des réseaux non locaux.

+0

Mais avec cette méthode, il renvoie l'adresse du serveur, et non du client. Je veux savoir (dans le serveur, pour enregistrer un journal des connexions) l'adresse IP des clients. Merci pour votre réponse! – a0rtega

+0

@ a0rtega le serveur et les objets client étendent socket, donc la méthode '.addr' est utilisée pour les deux. – Blake

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 en fait un peu plus simple:

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