2011-03-22 6 views
17

मुझे दस्तावेज़ों को खोजने में कुछ परेशानी हो रही है कि तीसरे तर्क के लिए socket पर इन सेटिंग्स के बीच भेद क्या है। मैं टीसीपी और यूडीपी और उनके मतभेदों के बारे में जानता हूं और यह भी कि आईपी एक परत ऊपर (नीचे?) स्टैक पर है ... मेरा यूडीपी कोड उसी तरह काम करता है चाहे मैं इसे IPPROTO_IP या IPPROTO_UDP पर सेट करता हूं।IPPROTO_IP बनाम IPPROTO_TCP/IPPROTO_UDP

उत्तर

14

प्रलेखन ip(7) निर्दिष्ट करता है कि आप यूडीपी और 0 या IPPROTO_TCP टीसीपी के लिए के लिए 0 या IPPROTO_UDP उपयोग करने के लिए है कि सहित विभिन्न manpages बीच विभाजित है। जब आप 0 का उपयोग करते हैं, जो IPPROTO_IP का मान होता है, तो यूडीपी SOCK_DGRAM के लिए उपयोग किया जाता है और टीसीपी SOCK_STREAM के लिए उपयोग किया जाता है।

मेरी राय में स्वच्छ रास्ता एक यूडीपी या टीसीपी आईपीवी 4 सॉकेट वस्तु बनाने के लिए इस प्रकार है:

int sock_udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
int sock_tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

कारण यह है कि यह आम तौर पर स्पष्ट होना बेहतर निहित से है। इस विशिष्ट मामले में 0 या तीसरे तर्क के लिए IPPROTO_IP का उपयोग करके आपको कुछ भी लाभ नहीं मिलता है।

यह भी एक प्रोटोकॉल का उपयोग करने की कल्पना करें जो sctp जैसे स्ट्रीम और डेटाग्राम दोनों कर सकता है। हमेशा सॉकटाइप और प्रोटोकॉल दोनों निर्दिष्ट करके आप किसी भी अस्पष्टता से सुरक्षित हैं।

11

IPPROTO_IP कच्चे आईपी पैकेट के लिए है। टीसीपी और यूडीपी प्रोटोकॉल आईपी पर आधारित हैं। यदि आप कच्चे आईपी सॉकेट खोलते हैं, तो आप सभी आईपी बाइट्स को स्वयं इकट्ठा करने के लिए ज़िम्मेदार हैं। कच्चे आईपी सॉकेट खोलने के लिए आपको विशेषाधिकार प्राप्त पहुंच की आवश्यकता हो सकती है।

netinet/in.h से

: socket() लिनक्स पर के लिए

/* 
* Protocols (RFC 1700) 
*/ 
#define IPPROTO_IP    0    /* dummy for IP */ 
#define IPPROTO_UDP    17    /* user datagram protocol */ 
#define IPPROTO_TCP    6    /* tcp */ 
+1

जब मैंने कच्चे आईपी सॉकेट को खोला तो मेरा यूडीपी कोड अभी भी ठीक काम करता है? –

+1

क्योंकि कई परिस्थितियों में तीसरे तर्क को नजरअंदाज कर दिया जाता है। – bmargulies

+4

[एमएसडीएन] के अनुसार (http://msdn.microsoft.com/en-us/library/ms740506 (VS.85) .aspx): 'यदि 0 का मान निर्दिष्ट है, तो कॉलर एक निर्दिष्ट नहीं करना चाहता प्रोटोकॉल और सेवा प्रदाता प्रोटोकॉल का उपयोग करने के लिए चुनेंगे। ' –

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