2010-10-07 4 views
5

मैं सी ++ में क्लाइंट यूडीपी सॉकेट कैसे बना सकता हूं ताकि यह किसी पोर्ट पर सुन सके जिसे किसी अन्य एप्लिकेशन द्वारा सुना जा रहा है? दूसरे शब्दों में, मैं सी ++ में पोर्ट मल्टीप्लेक्सिंग कैसे लागू कर सकता हूं?सी ++ यूडीपी सॉकेट पोर्ट मल्टीप्लेक्सिंग

+0

आप ऐसा क्यों करेंगे? – jweyrich

+0

मल्टीप्लेक्सिंग केवल तभी उपयोगी होती है जब सॉकेट का दूसरा छोर मक्स्ड डेटा की अपेक्षा कर रहा हो (जब तक कि आप उस डेटा को "फोर्ज" करने की कोशिश नहीं कर रहे हैं जो दूसरे छोर की अपेक्षा करता है)। – dreamlax

+0

मुझे लगता है कि मुझे परिदृश्य को थोड़ा बेहतर समझा जाना चाहिए। मेरे पास पोर्ट 5000 पर चल रहा एक एप्लीकेशन है। मैं उसी पोर्ट पर सुनना चाहता हूं, ताकि मैं ऐप प्राप्त करने वाले सभी पैकेट प्राप्त और पार्स कर सकूं। मैंने सोचा कि मैं सॉकेट को बाध्य करने के लिए SO_REUSEADDR विकल्प का उपयोग कर सकता हूं, लेकिन मेरे प्रोग्राम से पहले बंद करने के लिए मूल एप्लिकेशन के लिए यह WAITS उसी पोर्ट पर पैकेट प्राप्त करता है। मुझे उम्मीद है कि प्रश्न और वांछित व्यवहार अब स्पष्ट है। जवाब के लिए धन्यवाद। – SkypeMeSM

उत्तर

3

मैं केवल एक बंदरगाह पर सुनने के लिए चाहते हैं

आप क्या कर सकते हैं एक स्निफर के साथ कि। बस विभिन्न बंदरगाहों से पैकेट को अनदेखा करें।

क्योंकि मेरे कार्यक्रम यह बजाय

ठीक है भेज देंगे मूल आवेदन की, यहाँ मैं सुझाव है कि आप स्निफर्स त्यागने के लिए, और एक MITM का उपयोग मैं, कुछ विशेष पैकेट भेजने से रोकने के लिए आवश्यकता हो सकती है तकनीक।

आप एक "प्रॉक्सी" आवेदन करने के लिए डाइवर्ट पैकेट के लिए एक PREROUTING फ़ायरवॉल नियम पर भरोसा करने की आवश्यकता होगी। यूडीपी, लिनक्स, iptables मान लिया जाये, और "प्रॉक्सी" एक ही मेजबान पर चल रहा है, यहाँ "प्रॉक्सी" वास्तव में क्या करने की जरूरत है:

1.डाइवर्ट के लिए फ़ायरवॉल नियम जोड़ें पैकेट (मैन्युअल रूप से ऐसा है, अगर आप पसंद करते हैं):

iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport> 
    -j REDIRECT --to-port <newport> 

2. बाइंड और <newport> पर सुनने।

3. 2 एंडपॉइंट्स (क्लाइंट, और मूल गंतव्य) के बीच सभी ट्रैफ़िक रिले करें।यदि आप एक अलग मेजबान पर "प्रॉक्सी" चला रहे हैं, तो मूल गंतव्य पता पुनर्प्राप्त करने के लिए SO_ORIGINAL_DST के साथ getsockopt का उपयोग करें।

यह मुश्किल लग सकता है, लेकिन ... हाँ, ऐसा इसलिए है क्योंकि यह थोड़ा मुश्किल है :-) अगर मेरी धारणा अलग हो जाती है तो अपने फ़ायरवॉल दस्तावेज़ों से परामर्श लें।

+0

मुझे लगता है कि यह वही है जो मुझे चाहिए। :) बहुत बहुत धन्यवाद। – SkypeMeSM

1

यह नहीं बहुसंकेतन है - कि इस शब्द का एक ही प्रक्रिया में कई चैनलों पर से निपटने आई/ओ और जहां select(2) और poll(2) तरह बातें सबसे उपयोगी होते हैं के लिए आरक्षित है।

आप जो पूछ रहे हैं वह multicast है। Here मूल उदाहरण है।

ध्यान दें कि आईपी मल्टीकास्टिंग के लिए एक विशेष श्रेणी के पते (ए.के.ए. समूह) को सुरक्षित रखता है। ये विशेष ईथरनेट पते पर मैप किए जाते हैं। श्रोता (0) को मल्टीकास्ट समूह में शामिल होना होगा, जबकि प्रेषक को यह नहीं करना चाहिए, यह सामान्य रूप से सामान्य रूप से भेजता है।

उम्मीद है कि इससे मदद मिलती है।

+0

मेरे पास पोर्ट 5000 पर चल रहा एक सॉफ्टवेयर ऐप है, और मैं उस एप्लिकेशन को संशोधित नहीं कर सकता ताकि वह किसी भी मल्टीकास्ट समूह या इसी तरह से जुड़ सके। मैं उसी पोर्ट पर सुनना चाहता हूं ताकि मेरा कोड उस एप्लिकेशन द्वारा प्राप्त सभी पैकेट को पार्स कर सके। मुझे एक धारणा थी कि इसे 'पोर्ट मल्टीप्लेक्सिंग' कहा जाता था, लेकिन मैं इसके लिए एक उचित उदाहरण नहीं ढूंढ पा रहा हूं। – SkypeMeSM

+0

फिर Wireshark (http://www.wireshark.org/) प्राप्त करें, पैकेट को स्नीफ करें, फ़ाइल में डंप करें, और उस पर जाएं। –

+0

मैं पैकेट को ऑफ़लाइन देखने के लिए वायरशर्क का उपयोग कर रहा हूं, लेकिन मुझे एक सी ++ प्रोग्राम लिखना है जो किसी विशेष पोर्ट पर स्नीफ या सुनता है, न कि सभी बंदरगाहों पर, और यह ऑफ़लाइन नहीं हो सकता है। मैं libpcap लाइब्रेरी का उपयोग कर सकता हूं, लेकिन जैसा कि मैंने कहा था कि मैं केवल एक बंदरगाह पर सुनना चाहता हूं, और मुझे इसे कुछ विशेष पैकेट भेजने से रोकने की आवश्यकता हो सकती है, क्योंकि मेरा प्रोग्राम इसे मूल एप्लिकेशन के बजाय भेज देगा !! मुझे यकीन नहीं है कि मैं आपको बहुत उलझन में डाल रहा हूं :) – SkypeMeSM

2

यह सिर्फ tcpdump या snoop की तरह पैकेट स्नीफिंग है, एक कच्ची सॉकेट खोलें और तार और फ़िल्टर से सबकुछ खींचें जैसा आपको चाहिए। चीजों को थोड़ा आसान बनाने के लिए आप शायद libpcap का उपयोग करना चाहेंगे।

व्यवस्थापक या सुपर-उपयोगकर्ता विशेषाधिकारों के बिना आपको प्लेटफ़ॉर्म के लिए उपयुक्त SO_REUSEADDR और SO_REUSEPORT के साथ बंदरगाहों को खोलने के लिए लक्षित एप्लिकेशन की आवश्यकता होगी। चेतावनी आपको केवल प्रसारण और मल्टीकास्ट पैकेट प्राप्त कर सकती है, यूनिकास्ट पैकेट को पहली खुली सॉकेट में वितरित किया जाता है।

+0

ठीक है। तो, आपकी राय में, एकमात्र अन्य विकल्प नेटवर्क इंटरफ़ेस पर प्रत्येक पैकेट को स्नीफ करने के लिए libpcap का उपयोग कर रहा है और उसके बाद उस विशेष पोर्ट के लिए पैकेट फ़िल्टर करें। मैं सोच रहा था कि चूंकि ये यूडीपी पैकेट (कनेक्शन-कम) हैं, इसलिए उसी पोर्ट पर पैकेट को निष्क्रिय/सक्रिय रूप से भेजने/प्राप्त करने में कोई समस्या नहीं होनी चाहिए। – SkypeMeSM

+0

मैंने कोशिश की है, लिनक्स केवल पहली सॉकेट में पहुंचाता है, यह यूनिकास्ट पैकेट को मल्टीप्लेक्स नहीं करता है। अन्य प्लेटफॉर्म प्रदर्शन कारणों से अलग होने की संभावना नहीं है। –