2012-04-12 5 views
5

मैं एक प्रोग्राम लिखना चाहता हूं और इसे दो मशीनों पर चलाऊंगा, और ईथरनेट फ्रेम में एक मशीन से दूसरे में कुछ डेटा भेजूंगा।क्या मैं सी ++ में ईथरनेट आधारित नेटवर्क प्रोग्राम लिख सकता हूं?

आम तौर पर एप्लिकेशन डेटा ओएसआई मॉडल की परत 7 पर है, क्या कर्नेल प्रतिबंध या एपीआई प्रतिबंध जैसी कोई चीज है, जो मुझे एक प्रोग्राम लिखने से रोकती है जिसमें मैं एक गंतव्य मैक पता निर्दिष्ट कर सकता हूं और कुछ डेटा भेज सकता हूं वह मैक ईथरनेट पेलोड के रूप में? फिर आने वाले फ्रेम सुनने के लिए एक प्रोग्राम लिखें और फ्रेम से डेटा के पेलोड को निकालने, निर्दिष्ट स्रोत मैक पते से फ्रेम को पकड़ें?

(इसलिए मैं आईपी या टीसीपी/यूडीपी हेडर जैसे किसी अन्य ओवरहेड नहीं चाहता, मैं परत 2 से अधिक नहीं जाना चाहता)।

क्या यह सी ++ में किया जा सकता है, या आईपी परत पर सभी संचार होना चाहिए, और क्या यह उबंटू पर किया जा सकता है? संकेत देने या उदाहरण प्रदान करने के लिए अतिरिक्त प्यार! : डी

मेरी समस्या स्पष्ट रूप से मैं सी ++ में नेटवर्क प्रोग्रामिंग के लिए नया हूं और जहां तक ​​मुझे पता है, अगर मैं किसी नेटवर्क पर संवाद करना चाहता हूं तो मुझे socket() कॉल या इसी तरह का उपयोग करना होगा, जो आईपी परत पर काम करता है , तो क्या मैं ओएसआई लेयर 2 पर काम करने के लिए एक सी ++ प्रोग्राम लिख सकता हूं, क्या इसके लिए एपीआई हैं, क्या लिनक्स कर्नेल भी इसे अनुमति देता है?

+1

सी ++ एक प्रोग्रामिंग भाषा है, आईपी परत एक सार अवधारणा है। आपके टेक्स्ट में दूसरे को बदलना मेरे बाहर है। – littleadv

+5

@littleadv: क्यों? वह बिल्कुल नहीं जानता कि क्या पूछना है ("मैं सी ++ में कच्चे सॉकेट का उपयोग कैसे करूं?"), लेकिन आप पूरी तरह से अर्थ समझ सकते हैं। – cha0site

+3

सैद्धांतिक रूप से C++ के बाद 2 में जाने में कोई समस्या नहीं होनी चाहिए, लेकिन ओएस समर्थन आपको सीमित कर सकता है। यद्यपि यूडीपी बहुत कम ओवरहेड है, बस इसका इस्तेमाल करें। –

उत्तर

7

आप पहले से ही सॉकेट उल्लेख किया है, शायद तुम सिर्फ एक रॉ सॉकेट का उपयोग करना चाहते हैं। शायद यह page with C example code कुछ मदद की है।


मामले में आप एक कार्यक्रम केवल ईथरनेट का उपयोग अभी भी उपयोगी किया जा रहा है थोड़ी देर के लिए एक विचार के लिए देख रहे हैं:

Wake on LAN उस में मूल रूप काफी सरल है। ध्यान दें कि अधिकांश मौजूदा कार्यान्वयन वास्तव में यूडीपी पैकेट भेजते हैं (यह दर्शाते हुए कि रिसीवर पैकेट हेडर आदि के लिए पार्स नहीं करता है लेकिन पैकेट के पेलोड में केवल एक स्ट्रिंग)।


कच्चे सॉकेट का उपयोग आमतौर पर विशेषाधिकार प्राप्त उपयोगकर्ताओं तक ही सीमित होता है। आप या तो

  • रूट के रूप में अपने कार्यक्रम पर कॉल करें या इसे जड़ के स्वामित्व और setuid बिट
  • सेट या रॉ सॉकेट setcap CAP_NET_RAW+ep /path/to/your/program-file

पिछले का उपयोग कर बनाने के लिए क्षमता सेट करने के लिए आवश्यकता हो सकती है विकल्प अन्य दो की तुलना में अधिक बढ़िया दाग विशेषाधिकार (केवल कच्चे सॉकेट, आपकी पूरी फाइल सिस्टम आदि तक पहुंच नहीं लिखता) देता है। हालांकि यह अभी भी कम व्यापक रूप से ज्ञात है, क्योंकि यह कर्नेल 2.6.24 (जो उबंटू 8.04 के साथ आया था) से "केवल" समर्थित है।

+0

में भी कर सकते हैं आपके इनपुट और कोड उदाहरणों के लिंक के लिए धन्यवाद। इसने मेरे लिए चीजों को बहुत साफ कर दिया है :) – jwbensley

+0

खुशी है कि मैं मदद कर सकता हूं :) – zpea

5

हां, वास्तव में लिनक्स की एक बहुत अच्छी सुविधा है जो परत 2 पैकेट से निपटना आसान बनाता है। आप एक टीएपी डिवाइस का उपयोग कर सकते हैं, जो आपके यूजर स्पेस प्रोग्राम को कर्नेल के माध्यम से ईथरनेट यातायात को पढ़ने/लिखने की अनुमति देता है।

http://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/Documentation/networking/tuntap.txt

http://en.wikipedia.org/wiki/TUN/TAP

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

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