2017-02-15 6 views
7

मैं स्थिर रूटिंग के लिए बहुत नया हूं, हमारे ग्राहक ने सॉकेट के लिए स्थिर रूटिंग लागू करने का अनुरोध किया है। जब मैं googled मैं रूटिंग जानकारी सेट करने के लिए rtentry के साथ आया था। जब मैंने इस संरचना को खोला तो मैंने स्थिर रूटिंगसॉकेट के लिए एकाधिक रूटिंग प्रविष्टियों को कैसे सेट करें?

struct sockaddr rt_dst;  /* Target address. */ 
struct sockaddr rt_gateway;  /* Gateway addr (RTF_GATEWAY). */ 
struct sockaddr rt_genmask;  /* Target network mask (IP). */ 

पर फ़ील्ड देखा, लेकिन मैं यहां एकाधिक प्रविष्टि कैसे सेट कर सकता हूं? एकाधिक rtentry बनाने और ioctl(FileDes, SIOCADDRT, &rtentry) पर कॉल करने से मेरी समस्या ठीक हो जाएगी?

int32_t FileDes = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 
for(auto RtEntry : RtEntriesList) 
{ 
    ioctl(FileDes, SIOCADDRT, RtEntry)` 
} 

यदि मैं कॉन्फ़िगर करता हूं, तो मैं इसका परीक्षण कैसे कर सकता हूं? यह उपयोगी होगा यदि आप इन चीजों के बारे में अधिक जानने के लिए एक लिंक प्रदान कर सकते हैं।

+0

गिल्सन, क्या आप अपने प्रश्न के हिस्से को अधिक जानकारी में "सॉकेट के लिए स्थिर रूटिंग लागू करने के लिए अनुरोध किए गए क्लाइंट" का विस्तार कर सकते हैं? सॉकेट में आमतौर पर कोई अतिरिक्त रूटिंग चयन नहीं होता है, वे केवल सिस्टम-व्यापी परिभाषित रूटिंग का उपयोग करते हैं; और rtentry सामान्य सॉकेट के लिए नहीं है, यह प्रशासनिक सॉकेट के लिए सिस्टम-व्यापी रूटिंग प्राप्त करने और सेट करने के लिए है (इसका उपयोग विशेषाधिकार प्राप्त 'रूट एड' कमांड द्वारा किया जाता है: http://unix.stackexchange.com/questions/274094/can-not जोड़ें स्थैतिक मार्ग में मेरी-ubuntu-siocaddrt-नेटवर्क-है-पहुंच योग्य नहीं)। – osgx

+0

@osgx हमें स्थिर रूटिंग प्रदान करने के लिए/etc/network/interface फ़ाइल को संशोधित करना होगा। मैं उस हिस्से के बारे में स्पष्ट हूं, हमें इन रूटिंग जानकारी को इंटरफ़ेस में सेट करना होगा ताकि यह पुनरारंभ किए बिना कॉन्फ़िगरेशन ले सके। इसके लिए हमें रूटिंग जानकारी को प्रशासनिक सॉकेट के माध्यम से सेट करना होगा। तो मैं उलझन में हूं कि इन सूचनाओं को कैसे सेट करें। वे रूट कमांड निष्पादित नहीं करना चाहते हैं या स्थिर रूटिंग कॉन्फ़िगरेशन सेट करने के लिए डिवाइस को पुनरारंभ नहीं करना चाहते हैं। मुझे आशा है कि आप मेरे प्रश्न के बारे में स्पष्ट हैं। –

+0

गिल्सन, 'मार्ग' या ['आईपी रूट'] के स्रोतों की जांच करें (https://access.redhat.com/sites/default/files/attachments/rh_ip_command_cheatsheet_1214_jcs_print.pdf) उपकरण (sourceforge.net/projects/net-tools ,) और/या 'मार्ग जोड़ें 'आदेशों के' strace'/'ltrace' /' sysdig' करें जो वांछित रूटिंग सेट करने के लिए उपयोग किए जाते हैं। – osgx

उत्तर

3

अंततः मुझे मेरे जवाब मिल गए।

int32_t FileDes = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

struct rtentry Route1; 
struct rtentry Route2; 
struct rtentry Route3; 

// configure Route1 
// configure Route2 
// configure Route3 

RtEntriesList.push_back(&Route1); 
RtEntriesList.push_back(&Route2); 
RtEntriesList.push_back(&Route3); 

for(auto RtEntry : RtEntriesList) 
{ 
    ioctl(FileDes, SIOCADDRT, RtEntry); 
} 

काम करेगा, हम बहु रूटिंग प्रविष्टियां बना सकते हैं और सॉकेट एफडी में जोड़ सकते हैं। और यह सिस्टम चौड़ी रूटिंग तालिका अपडेट करेगा।

route add .. आदेश

करने के लिए अपने समान परीक्षण के लिए मैं अपने पीसी आईपी पते के रूप में प्रवेश द्वार की स्थापना की और wireshark वहाँ शुरू कर दिया। रूटिंग कॉन्फ़िगरेशन सेट करने के बाद आईपी की दी गई रेंज मेरे पीसी पर रूट की जाती है। जानकारी के लिए धन्यवाद @osgx कि यह वास्तव में सिस्टम चौड़ी रूटिंग तालिका सेट कर रहा है।

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