2008-09-16 15 views
19

मैं एक सी ++ प्रोग्रामर/नेटवर्क व्यवस्थापक हूं, लेकिन मुझे लगता है कि अगर मैं सही दिशा में मुझे इंगित करता हूं तो मैं यह कैसे सीख सकता हूं। अधिकांश ट्यूटोरियल पुराने कोड का उपयोग करके प्रदर्शित किए जाते हैं जो अब किसी कारण से काम नहीं करते हैं।मैं सी ++ में रॉ टीसीपी/आईपी पैकेट कैसे बना सकता हूं?

चूंकि मैं लिनक्स पर हूं, मुझे केवल कच्चे बर्कले सॉकेट लिखने के बारे में एक स्पष्टीकरण की आवश्यकता है। क्या कोई मुझे जल्दी से नीचे चला सकता है?

+1

रॉ सॉकेट बहुत मुश्किल हैं और विभिन्न प्रणालियों पर थोड़ा अलग हैं। मुझे केवल उन लोगों के बारे में पता है जो कोड स्नीफर्स (जैसे 'वायरशर्क') और कुछ बल्कि आर्केन डायग्नोस्टिक्स के लिए उपयोग करते हैं। सॉकेट प्रोग्रामिंग सीखना शुरू करने के लिए वे निश्चित रूप से एक अच्छी जगह नहीं हैं। ज्यादातर मामलों में "मैं एक शुरुआत सी ++ प्रोग्रामर/नेटवर्क व्यवस्थापक हूं" का अर्थ है "SOCK_RAW से दूर रहें"। –

+0

@ चककोलर्स, मैं असहमत हूं। मुझे लगता है कि सीखना कच्चे सॉकेट सी ++ सीखने का एक शानदार तरीका है, और विशेष रूप से सी। लाइब्रेरी का उपयोग करना एक बात है, लेकिन लिनक्स के साथ कच्चे सॉकेट एक बहुत ही अंतर्दृष्टिपूर्ण अनुभव है। सी ++ इतनी अनूठी चीजें कर सकता है। मुझे लगता है कि आपके दिल का दर्द होने से बचने की गलती है। – motoku

+0

आपके पास वास्तव में कौन सी प्रणाली है? "कच्चे" सॉकेट कार्यान्वयन एक सिस्टम से अगले में काफी भिन्न होते हैं, ताकि आप जो सीखते हैं (वास्तव में सिस्टम के बारे में अधिकतर, सी ++ के बारे में नहीं) कहीं और नहीं ले जाता है। –

उत्तर

5

शुरू करने के लिए एक अच्छी जगह Asio का उपयोग करना होगा जो नेटवर्क संचार के लिए एक महान क्रॉस-प्लेटफ़ॉर्म (लिनक्स) लाइब्रेरी है।

+1

आप कभी भी यूडीपी पैकेट दिखने या टीसीपी पैकेट की तरह व्यवहार नहीं कर सकते - दोनों के लिए आईपी पैकेट हेडर पारस्परिक रूप से अनन्य हैं। –

13

Beej's guide on socket programming पढ़कर शुरू करें। यह आपको नेटवर्क कोड लिखना शुरू करने के तरीके पर गति देगा। उसके बाद आप मैन पेज पढ़ने से अधिक से अधिक जानकारी लेने में सक्षम होना चाहिए।

इसमें से अधिकांश में आपकी पसंदीदा लाइब्रेरी के लिए प्रलेखन पढ़ने और मैन पेजों की बुनियादी समझ शामिल होगी।

1

इस पर बहुत सारे संदर्भ हैं (बेशक, स्टीवंस की पुस्तक दिमाग में आती है), लेकिन मुझे Beej guide को शुरू करने के लिए अविश्वसनीय रूप से उपयोगी पाया गया। यह काफी मांसपेशियों में है कि आप समझ सकते हैं कि वास्तव में क्या हो रहा है, लेकिन यह इतना आसान है कि आपको 'हैलो वर्ल्ड' udp क्लाइंट/सर्वर लिखने में कई दिन नहीं लगते हैं।

1

आसान:

#include <sys/socket.h> 
#include <sys/types.h> 

int socket(int protocolFamily, int Type, int Protocol) 
// returns a socket descriptor 

int bind(int socketDescriptor, struct sockaddr* localAddress, unsigned int addressLength) 
// returns 0 

... आदि।

यह सिस में सब है/socket.h

3

आप इस में ठीक उसी तरह से आप नियमित रूप से सी में, वहाँ कोई सी ++ मानक पुस्तकालय में यह करने के लिए विशिष्ट तरीका है होता है।

यह सीखने के लिए मैंने उपयोग किया जाने वाला ट्यूटोरियल http://beej.us/guide/bgnet/ था। यह देखने के बाद मुझे मिला सबसे अच्छा ट्यूटोरियल था, यह स्पष्ट उदाहरण और वर्णन किए गए सभी कार्यों के अच्छे स्पष्टीकरण देता था।

6

टीसीपी क्लाइंट पक्ष के लिए: आईपी के लिए DNS नाम देखने के लिए

उपयोग gethostbyname, यह एक hostent संरचना वापस आ जाएगी। आइए इस लौटाए गए मूल्य होस्ट को कॉल करें।

sockaddr_in sock; 
sock.sin_family = AF_INET; 
sock.sin_port = htons(REMOTE_PORT); 
sock.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr; 

सॉकेट बनाने और फोन कनेक्ट:

s = socket(AF_INET, SOCK_STREAM, 0); 
connect(s, (struct sockaddr *)&sock, sizeof(sock)) 

टीसीपी सर्वर साइड के लिए:

hostent *host = gethostbyname(HOSTNAME_CSTR); 

सॉकेट पते संरचना भरें

सेटअप एक सॉकेट

बाइंड का उपयोग करके उस सॉकेट को अपना पता बाध्य करें।

प्रारंभ के साथ कि सॉकेट पर सुन सुन

कॉल कनेक्ट किए गए ग्राहक पाने के लिए स्वीकार करते हैं। < - इस बिंदु पर आप कनेक्शन को संभालने के लिए एक नया धागा उत्पन्न करते हैं, जबकि आप अगली कनेक्टेड क्लाइंट प्राप्त करने के लिए स्वीकार करने के लिए एक और कॉल करते हैं।

जनरल संचार:

उपयोग भेजने और recv पढ़ सकते हैं और क्लाइंट और सर्वर के बीच लिखने के लिए।

बीएसडी सॉकेट के स्रोत कोड उदाहरण:

आप wikipedia पर इसके कुछ अच्छे उदाहरण कोड पा सकते हैं।

अतिरिक्त पठन:

मैं अत्यधिक this book और this online tutorial की सिफारिश:

alt text

4:

+2

gethostbyname अब किसी नए प्रोजेक्ट के लिए उपयोग नहीं किया जाना चाहिए: यह एक आईपी संस्करण (आईपीवी 4) से जुड़ा हुआ है। अब जब आईपीवी 4 पते का शेष स्टॉक [तेजी से कम हो रहा है] (http://www.potaroo.net/tools/ipv4/index.html), आपको वास्तव में getaddrinfo का उपयोग करना चाहिए जो संस्करण-स्वतंत्र है (v4 और v6 के साथ काम करता है) । – bortzmeyer

1

पोस्टर, अपने प्रश्न को स्पष्ट करें।

लगभग सभी प्रतिक्रियाओं को लगता है कि आप सॉकेट ट्यूटोरियल के लिए पूछ रहे हैं; मैंने आपका प्रश्न यह है कि आपको मनमानी आईपी पैकेट भेजने में सक्षम कच्ची सॉकेट बनाने की आवश्यकता है। जैसा कि मैंने अपने पिछले उत्तर में कहा था, कुछ ओएस कच्चे सॉकेट के उपयोग को प्रतिबंधित करते हैं।

http://linux.die.net/man/7/raw "केवल 0 या CAP_NET_RAW क्षमता के प्रभावी उपयोगकर्ता आईडी के साथ प्रक्रियाओं को कच्चे सॉकेट खोलने की अनुमति है।"

10

स्टार्टर्स के लिए, यदि आप "कच्चे" से क्या मतलब समझते हैं तो यह सहायक होगा। परंपरागत रूप से इसका मतलब है कि आप सभी लेयर 4 हेडर (टीसीपी/यूडीपी/आईसीएमपी ... हेडर), और शायद कुछ आईपी हेडर को स्वयं बनाना चाहते हैं। इसके लिए आपको बीज के ट्यूटोरियल से अधिक की आवश्यकता होगी जिसका उल्लेख पहले से ही मेरे कई लोगों ने किया है। इस मामले में आप अपने कॉल में सॉकेट में SOCK_RAW तर्क का उपयोग करके प्राप्त कच्चे आईपी सॉकेट चाहते हैं (कुछ मूलभूत बातें के लिए http://mixter.void.ru/rawip.html देखें)।

यदि आप वास्तव में चाहते हैं कि कुछ रिमोट होस्ट जैसे टीसीपी कनेक्शन को स्टैकओवरफ्लो डॉट कॉम पर पोर्ट 80 स्थापित करने में सक्षम हो, तो आपको शायद "कच्चे" सॉकेट और बीज की मार्गदर्शिका की ज़रूरत नहीं है ।

विषय पर एक आधिकारिक संदर्भ के लिए, आपको वास्तव में यूनिक्स नेटवर्क प्रोग्रामिंग, वॉल्यूम 1: सॉकेट्स नेटवर्किंग एपीआई (तीसरा संस्करण) स्टीवन एट अल द्वारा उठाया जाना चाहिए।

1

रिचर्ड स्टीवंस द्वारा Unix Network Programming पढ़ें। यह बहुत जरूरी है। यह बताता है कि यह सब कैसे काम करता है, आपको कोड देता है, और यहां तक ​​कि आपको सहायक तरीके भी देता है। आप उनकी कुछ अन्य किताबों को देखना चाह सकते हैं। यूनिक्स में निम्न स्तर के प्रोग्रामिंग के लिए Advanced Programming In The Unix Enviernment आवश्यक है। मैं अब यूनिक्स स्टैक पर सामान भी नहीं करता हूं, और इन पुस्तकों से स्टफ अभी भी मैं कोड कैसे मदद करता हूं।

1

Libpcap आपको पूर्ण पैकेट (लेयर 2 के माध्यम से परत 2) तैयार करने और तार पर उन्हें भेजने की अनुमति देगा। जैसा लगता है उतना मजेदार है, इसके साथ कुछ चेतावनी भी हैं। आपको सभी उपयुक्त शीर्षलेख बनाने और स्वयं को सभी चेकसमिंग करने की आवश्यकता है। Libnet इसके साथ मदद कर सकते हैं, हालांकि।

यदि आप सी ++ प्रोग्रामिंग पूल से बाहर निकलना चाहते हैं, तो scapy पाइथन के लिए है। यह टीसीपी/आईपी पैकेट को शिल्प और संचारित करने के लिए तुच्छ बनाता है।

2

मैं पिछले वर्ष के लिए libtins विकसित कर रहा हूं।यह एक उच्च स्तरीय सी ++ पैकेट क्राफ्टिंग और लाइब्रेरी स्नीफिंग है।

जब तक आप पहिया को फिर से शुरू नहीं करना चाहते हैं और प्रत्येक प्रोटोकॉल के आंतरिक को लागू नहीं करना चाहते हैं, तो मैं आपको कुछ उच्च स्तरीय पुस्तकालय का उपयोग करने की सलाह दूंगा जो पहले से ही आपके लिए करता है।

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

  • कोई संबंधित समस्या नहीं^_^