2012-08-03 17 views
7

जावा में नेटवर्क इंटरफ़ेस खोजना जावा में, मैं java.net.NetworkInterface को इंटरफ़ेस के साथ संबंधित डिफ़ॉल्ट गेटवे तक पहुंचाना चाहता हूं। इंटरफेस, आदि के नाम, समय से पहले नहीं जानते हैं।जावा गेटवे

$ netstat -r 
Kernel IP routing table 
Destination  Gateway   Genmask   Flags MSS Window irtt Iface 
10.10.10.0  *    255.255.255.0 U   0 0   0 bond0 
10.10.11.0  *    255.255.255.0 U   0 0   0 eth2 
10.10.11.0  *    255.255.255.0 U   0 0   0 eth3 
10.10.12.0  *    255.255.255.0 U   0 0   0 eth4 
10.10.13.0  *    255.255.255.0 U   0 0   0 eth5 
default   mygateway  0.0.0.0   UG  0 0   0 bond0 

कुछ गूगल खोज करने के बाद, मैं अभी भी किसी भी सवाल का जवाब नहीं मिला है:

अन्य-शब्दों में, यदि निम्नलिखित मेरी अनुमार्गण तालिका था, मैं इंटरफेस के साथ "bond0" इसी चाहते हैं।

संपादित करें:
जावा रनटाइम कैसे यह जानकारी प्राप्त करने के लिए (कहना है कि यह उजागर है) "पता" चाहिए। Java.net में शामिल होने पर। मल्टीकास्ट सॉकेट में शामिल होने वाले मल्टीकास्ट समूह में (InetAddress grpAddr) कॉल (जो इंटरफ़ेस निर्दिष्ट नहीं करता है), स्पष्ट व्यवहार "डिफ़ॉल्ट" इंटरफ़ेस (जैसा ऊपर परिभाषित किया गया है) पर शामिल होना प्रतीत होता है। यह तब भी काम करता है जब डिफ़ॉल्ट intf रूटिंग तालिका में सूचीबद्ध पहला इंटरफ़ेस नहीं होता है। हालांकि, अंतर्निहित POSIX कॉल है कि एक mcast समूह से जुड़ता है इस जानकारी !:

struct ip_mreqn group; 
group.imr_multiaddr = ... 
group.imr_address = **address of the interface!** 
setsockopty(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group)); 

बिंदु की आवश्यकता है: एक बहुस्त्र्पीय समूह है कि INTF, जावा मंच की आवश्यकता नहीं है में शामिल होने के लिए एक विधि प्रदान करके, परोक्ष , प्रत्येक मंच पर उपयुक्त intf निर्धारित करने के लिए पता होना चाहिए।

उत्तर

0

जहां तक ​​मुझे पता है, ऐसा करने का कोई अच्छा तरीका नहीं होगा, क्योंकि जावा के लिए क्रॉस-प्लेटफार्म तरीके में लागू करने के लिए ऐसे निम्न स्तर के विवरण बहुत मुश्किल हैं। java.net.NetworkInterface थोड़ा सा मदद कर सकता है, लेकिन यदि उपलब्ध विधियां पर्याप्त नहीं हैं तो आपको कुछ छोटे यूगलियर का सहारा लेना पड़ सकता है।

क्या यह ऐसा कुछ है जो हमेशा के लिए निर्दिष्ट प्लेटफॉर्म पर चलता है, या इसे और अधिक पोर्टेबल होने की आवश्यकता है? सबसे खराब, आप सिस्टम कमांड निष्पादित करने और आउटपुट को पार्स करने का प्रयास कर सकते हैं, लेकिन यह बहुत पोर्टेबल या स्थिर नहीं है।

कुछ संबंधित विषयों:

Is it possible to get the default gateway IP and MAC addresses in java?

Finding SSID of a wireless network with Java

+0

ऊपर संपादित देखें ... – Josh

+0

ठीक है, मैं आपका बिंदु देखता हूं। हालांकि, ऐसा लगता है कि कॉल को अभी भी एक पता की आवश्यकता है, हां? java.net.NetworkInterface इंटरफेस (और उनके पते) प्राप्त कर सकता है, और थोड़ा चतुरता यह तय कर सकती है कि किसके पास दिए गए पते का मालिक है। मुझे लगता है कि आपकी समस्या अधिक जटिल है, क्योंकि आप पहले निम्न स्तर की रूटिंग जानकारी की तलाश में हैं, फिर (डिफ़ॉल्ट) मार्ग से जुड़े इंटरफ़ेस को खोजने के लिए पीछे की तरफ। – Carl

+0

इसे मल्टीकास्ट पता (यानी, 224.xxx-239.xxx में विशेष पता) की आवश्यकता है, इंटरफ़ेस का पता नहीं। तर्क में ऐसी कोई जानकारी प्रदान नहीं की जाती है। तो समस्या "कॉल" कॉल को हल करना चाहिए वही है। यह जादुई रूप से डिफ़ॉल्ट मार्ग (स्पष्ट व्यवहार) के साथ एक चुनता है। इसी प्रकार, मैं जानना चाहता हूं कि कौन सा इंटरफ़ेस डिफ़ॉल्ट मार्ग है। – Josh

4

मेरे तरीका है:

try(DatagramSocket s=new DatagramSocket()) 
{ 
    s.connect(InetAddress.getByAddress(new byte[]{1,1,1,1}), 0); 
    return NetworkInterface.getByInetAddress(s.getLocalAddress()).getHardwareAddress(); 
} 
क्योंकि आंकड़ारेख (यूडीपी) का उपयोग करने का

, यह कहीं भी कनेक्ट नहीं हो रहा है, इसलिए बंदरगाह संख्या अर्थहीन और दूरस्थ पता हो सकती है (1.1.1.1) पहुंच योग्य नहीं होने की आवश्यकता है, केवल रूटेबल।

+0

यह विंडोज़ और आईपीवी 6 के साथ काम नहीं करता है। getLocalAddress v6 सॉकेट – the8472

+0

के रूप में बाध्य होने के बावजूद एक फर्जी v4 पता देता है यह कोड केवल मैक पता दिखाता है। – Razavi

+0

माइक्रोसॉफ्ट-एंड्रॉइड-एमुलेटर, डॉकर और ओपनवीपीएन के साथ विंडोज 10 और हाइपर-वी सक्षम पर मेरे लिए काम करता है। – AlexS

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