2011-05-31 6 views
10

मैं टीसीपी बनाम यूडीपी की अवधारणा को समझ सकता हूं, लेकिन फिर भी मुझे नहीं लगता कि यूडीपी पैकेट भेजने के 2 तरीके हैं, और इसके साथ में मुझे अभी भी समझ में नहीं आता है कि यह बाध्य() और स्वीकार करने के लिए बिल्कुल जरूरी है() ...यूडीपी सॉकेट के साथ कनेक्ट/भेजें/आरईवी के बजाय sendto/recvfrom का उपयोग करने का क्या उद्देश्य है?

उत्तर

26
  1. accept() टीसीपी के लिए है। इसका यूडीपी के साथ कुछ लेना देना नहीं है।

  2. connect() यूडीपी में कुछ भी नहीं करता है, यह केवल स्थानीय एपीआई को यह जानने के लिए परिस्थिति देता है कि आप किससे भेज रहे हैं और प्राप्त कर रहे हैं।

  3. आप पहले से ही है कि पता नहीं है, या परवाह नहीं है, या एक ही सॉकेट के साथ आपको अनेक स्थानों पर भेजना चाहते हैं, तो आप connect() का उपयोग नहीं करते हैं, तो आप sendto() बजाय का उपयोग करें। इसी प्रकार प्राप्त करने के लिए।

    उदाहरण के लिए एक यूडीपी सर्वर पर विचार करें। यह recvfrom(), कहेंगे तो यह स्रोत पते की जानकारी, प्रक्रिया अनुरोध प्राप्त होता है, प्रतिक्रिया बनाते हैं, और sendto(). नहीं connect() कहीं भी शामिल है, Ergo संभव नहीं के माध्यम से उस पते पर भेजने का उपयोग करने के लिए या तो send() या recv().

  4. यह है केवल bind() एक सर्वर के लिए आवश्यक है, क्योंकि ग्राहकों को भेजने के लिए एक निश्चित पोर्ट नंबर की आवश्यकता है। किसी ग्राहक को bind() की आवश्यकता नहीं है: एक स्वचालित बाध्य() सिस्टम-असाइन किए गए स्थानीय पोर्ट नंबर का उपयोग कर पहले send()/sendto()/recv()/recvfrom() पर होगा।

+0

सुनने के बारे में क्या()? और बाध्य() विधि के बारे में, क्या इसका मतलब यह है कि मुझे उस बंदरगाह पर जो कुछ भी जमीन मिलती है? – jokoon

+1

@gokoon 1. सुनो() टीसीपी के लिए है। इसका यूडीपी के साथ कुछ लेना देना नहीं है। 2. एक प्रश्न के रूप में, बाइंड() के बारे में क्या मतलब है? 3. हां, यदि आप कनेक्ट नहीं हैं तो आप उस यूडीपी पोर्ट को संबोधित सब कुछ प्राप्त करते हैं। – EJP

+0

@EJP यह http://linux.die.net/man/7/udp कहता है कि जब कनेक्ट() को कॉल किया जाता है, तो यूडीपी पढ़ने/लिखने का उपयोग करता है! तो पढ़ें/लिखें या भेजें/recv? – onmyway133

8

यह समझना महत्वपूर्ण है कि टीसीपी कनेक्शन उन्मुख है, जबकि यूडीपी एक कनेक्शन रहित प्रोटोकॉल है।

  • टीसीपी: आपको दूरस्थ होस्ट से डेटा भेजने/प्राप्त करने से पहले कनेक्ट करने की आवश्यकता है।
  • यूडीपी: कोई कनेक्शन आवश्यक नहीं है। आप किसी भी मेजबान से डेटा भेज/प्राप्त कर सकते हैं।

गंतव्य निर्दिष्ट करने के लिए आप आमतौर पर यूडीपी सॉकेट पर sendto() का उपयोग करेंगे। इसी तरह, आप सामान्य रूप से recvfrom() का उपयोग यह जानने के लिए करेंगे कि यूडीपी डेटा कहां से प्राप्त हुआ था।

हालांकि, आप वास्तव में एक विकल्प के रूप में यूडीपी सॉकेट पर connect() का उपयोग कर सकते हैं। उस स्थिति में, आप connect() के साथ निर्दिष्ट पते पर डेटा भेजने के लिए और पते से डेटा प्राप्त करने के लिए यूडीपी सॉकेट पर send()/recv() का उपयोग कर सकते हैं। (connect() UDP सॉकेट पर केवल डिफ़ॉल्ट सहकर्मी पता सेट करता है और आप के रूप में कई बार UDP सॉकेट पर connect() कॉल कर सकते हैं के रूप में आप चाहते हैं, और निश्चित रूप से UDP सॉकेट, पर connect(), कनेक्शन के लिए किसी भी हाथ मिलाना प्रदर्शन नहीं करता।)

उम्मीद है की यह मदद करेगा।

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