2009-08-16 9 views
5

मैं रूबी में एक टीसीपीएस सर्वर में क्लाइंट का आईपी पता प्राप्त करना चाहता हूं। और (यदि यह संभव है) मैक पता।टीसीपीएस सर्वर (रूबी) में मैं ग्राहक से आईपी/मैक कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए, रुबी में एक टाइम सर्वर, टिप्पणी देखें।

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 

बहुत बहुत धन्यवाद!

उत्तर

5

उपयोग socket.addr:

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

यह सॉकेट, बंदरगाह के प्रकार दिखा एक सरणी, और मेजबान जानकारी देता है।

मैक पते को ढूंढने के संबंध में, मुझे पता नहीं है कि जिस तरह से बनाया गया है। यदि आप स्थानीय मैक पता चाहते हैं, तो आप आरा हॉवर्ड के "मैकड्रर" मणि का उपयोग कर सकते हैं। यदि आप रिमोट मैक पता चाहते हैं, तो आप कमांड लाइन arp प्रोग्राम का उपयोग कर सकते हैं और इसके आउटपुट को पार्स कर सकते हैं। ध्यान दें कि यह केवल तभी वैध होगा जब रिमोट मशीन एक ही स्थानीय नेटवर्क पर है, क्योंकि मैक पते गैर-स्थानीय नेटवर्क पर प्रसारित नहीं होते हैं।

+0

लेकिन इस विधि के साथ यह सर्वर के पते देता है, ग्राहक की नहीं। मैं ग्राहकों के आईपी को जानना चाहता हूं (सर्वर में, कनेक्शन का लॉग सहेजने के लिए)। आपके उत्तर के लिए धन्यवाद! – a0rtega

+0

@ a0rtega दोनों सर्वर और क्लाइंट ऑब्जेक्ट्स सॉकेट का विस्तार करते हैं, इसलिए '.addr' विधि दोनों के लिए उपयोग किया जाता है। – Blake

8

रूबी 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" 

रूबी 1.9 यह एक छोटे और अधिक सरल बनाता है:

>> port, ip = Socket.unpack_sockaddr_in(socket.getpeername) 
=> [80, "209.191.122.70"] 
>> ip 
=> "209.191.122.70" 
संबंधित मुद्दे

 संबंधित मुद्दे