2013-01-23 14 views
12

मैं किसी विशेष नेटवर्क इंटरफ़ेस को सॉकेट कैसे बांध सकता हूं? मैंने सर्वर पक्ष पर setsockopt का उपयोग करने का प्रयास किया, लेकिन ग्राहक अभी भी eth0 और lo interfaces दोनों के माध्यम से सेवा तक पहुंच सकते हैं।नेटवर्क इंटरफ़ेस को बाइंड सॉकेट

मैं serv_addr.sin_addr.s_addr का उपयोग करके विशेष आईपी पता सेट करके इसे प्राप्त कर सकता हूं।

लेकिन मुझे संदेह है कि हम केवल setsockopt (आईपी पते का उल्लेख किए बिना) का उपयोग कर इंटरफ़ेस से जुड़ सकते हैं।

से आबद्ध होने का पता जानने के बिना का उपयोग कर serv_addr.sin_addr.s_addr

आप यह नहीं कर सकते विशेष IP पते निर्धारित करके -

उत्तर

2

एक ही तरीका है कि आप यह कर सकते हैं के रूप में आप का उल्लेख है।

यदि आपको आवश्यकता हो तो वर्तमान आईपी पता निर्धारित करने के लिए आप ioctl एस का उपयोग कर सकते हैं, हालांकि इन दिनों ऐसा करने का एक चालाक तरीका हो सकता है - मैंने हाल ही में आधुनिक लिनक्स डिस्ट्रोज़ में बहुत कुछ नहीं किया है।

+0

Thnks जो। क्या मैं SO_BINDTODEVICE के साथ सेटॉकटॉप का उपयोग जान सकता हूं? – user2003595

14

आप SO_BINDTODEVICE सॉकेट विकल्प सेट करके एक विशिष्ट इंटरफ़ेस से जुड़ सकते हैं।

struct ifreq ifr; 

memset(&ifr, 0, sizeof(ifr)); 
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0"); 
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) { 
    ... error handling ... 
} 

चेतावनी: आप जड़ होना है और आदेश में इस विकल्प का उपयोग करने में CAP_NET_RAW क्षमता होती है।

दूसरी विधि यह है कि आप getifaddrs() के साथ इंटरफेस से जुड़े आईपी पते को हल कर सकते हैं।

एक व्यापक उदाहरण के लिए बाद वाले लिंक का पालन करें।

+0

मुझे पता था कि एक ioctl से बेहतर तरीका होना चाहिए! :-) – Joe

+0

आप सही हैं .... अपडेट किया गया;) –

+0

मेरे पास एक नया सवाल है, तो क्या इससे कोई फर्क पड़ता है कि eth0 और eth1 में आपकी विधि का उपयोग करके एक ही आईपी पता है? – Splash

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