2009-04-21 11 views
11

सामान्य प्रोग्रामिंग: सर्वर सॉकेट स्वीकार() विधि में वास्तव में क्या होता है। निम्न स्तर पर सर्वर सॉकेट क्लाइंट सॉकेट से अलग कैसे होते हैं?सर्वर बनाम क्लाइंट सॉकेट (निम्न स्तर का विवरण)?

उत्तर

13

सबसे पहले, सर्वर सॉकेट आमतौर पर प्रसिद्ध नामों (बंदरगाहों, इस मामले में) से बंधे होते हैं और वे listen() के साथ स्वयं को स्थापित करते हैं। यही वह जगह है जहां वास्तविक अंतर होता है, क्योंकि क्लाइंट सॉकेट खुद को connect() के साथ स्थापित करते हैं। सॉकेट पर listen() को कॉल करने से कर्नेल के टीसीपी/आईपी कार्यान्वयन सॉकेट के बाध्य नाम (पोर्ट) को भेजे गए कनेक्शन स्वीकार करने के लिए होता है। ऐसा होगा कि आपने कभी accept() पर कॉल किया है या नहीं।

accept() बस आपके सर्वर को आपके सुनने की सॉकेट से जुड़े क्लाइंट सॉकेट तक पहुंचने और उससे संपर्क करने का एक तरीका प्रदान करता है।

+0

इसके अलावा, यदि आप विंडोज का उपयोग कर रहे हैं, तो Accept() के बारे में एमएसडीएन पृष्ठ भी अभ्यास में क्या होता है इसके बारे में अतिरिक्त जानकारी देता है: http://msdn.microsoft.com/en-us/library/ms737526(VS.85) .aspx – binarybob

3

प्रोग्रामिंग भाषा निर्दिष्ट किए बिना अपने प्रश्न का पूरी तरह उत्तर देना मुश्किल है। मैं अजगर के संबंध में जवाब दूंगा, क्योंकि मुझे पता है कि जवाब प्रतिनिधि हो सकता है।

यदि ssocket ऑब्जेक्ट है, तो एक सर्वर पहले s.bind(('',12345)) पर कॉल करके बंदरगाह से बांधता है। यह सर्वर मोड में एक सॉकेट बनाता है। यह पोर्ट 12345 पर डेटा पकड़ने के लिए तैयार है।

फिर कोई s.listen(10) पर कॉल करता है। यह सर्वर मोड में सॉकेट फेंकता है। इसका मतलब है कि इस सॉकेट द्वारा एक कनेक्शन के लिए अनुरोध प्राप्त होगा (एक समय में 10 लंबित अनुरोध)।

जब तक हम s.accept() तक पहुंचते हैं, तो ऑपरेटिंग सिस्टम पहले ही जानता है कि हम पोर्ट 12345 पर सुन रहे हैं। s.accept() केवल यही कहता है कि हम जो अनुरोध प्राप्त करते हैं उसके साथ हम क्या करने जा रहे हैं। पायथन में, s.accept()(connection,address) लौटाएगा जहां कनेक्शन दूसरे पोर्ट के माध्यम से कनेक्शन है। इस मामले में, connection क्लाइंट खोले गए सॉकेट ऑब्जेक्ट से बहुत अलग नहीं है। यह यहां से उचित रूप से सममित है।

8

यदि आप वास्तव में रुचि रखते हैं, तो मैं आपको TCP/IP Illustrated, Volume 2 पढ़ने की सलाह दूंगा। यदि आप चाहते हैं एक कम जवाब है, तो "हिम्मत में" अगर:

  • सर्वर सॉकेट प्रसिद्ध अंतिम बिंदुओं को बाध्य कर रहे हैं, जहां एक अंत बिंदु (प्रोटोकॉल, पता, पोर्ट) टपल है। एंडपॉइंट socket() सिस्टम कॉल में निर्दिष्ट प्रोटोकॉल द्वारा बनाया गया है और bind() सिस्टम कॉल में निर्दिष्ट पता जानकारी।
  • जब सर्वर listen() सिस्टम कॉल पर कॉल करता है, तो नेटवर्क स्टैक एक कतार बनाता है जिसमें लंबित कनेक्शन शामिल होते हैं। कतार के आकार के लिए एक संकेत backlog पैरामीटर listen() पर दिया गया है।
  • सर्वर फिर कतार से नया कनेक्शन खींचने के लिए accept() पर कॉल करता है।
  • क्लाइंट सॉकेट connect() पर कॉल में सर्वर एंडपॉइंट निर्दिष्ट करके सर्वर सॉकेट को संदेश भेजते हैं और फिर send() या write() का उपयोग करके डेटा भेजते हैं।
  • जब ग्राहक connect() पर कॉल करता है, तो सर्वर-साइड कतार पर एक कनेक्शन धक्का दिया जाता है जहां यह सर्वर कनेक्शन स्वीकार करता है।

यह विवरण केवल टीसीपी/आईपी सॉकेट के लिए वास्तव में मान्य है। यूडीपी सॉकेट (अनिवार्य रूप से) कनेक्ट होने के बाद से यूडीपी मामला सरल और काफी अलग है।

24

कम स्तर पर सॉकेट केवल सॉकेट हैं चाहे वे किसी सर्वर या क्लाइंट एप्लिकेशन में उपयोग किए जा रहे हों या नहीं। सिस्टम में दो झूठ के बीच का अंतर प्रत्येक प्रकार के आवेदन को कॉल करता है।

सर्वर सॉकेट बंदरगाह से जुड़े होने के लिए bind() पर कॉल करेगा। वे एक बंदरगाह से जुड़े रहना चाहते हैं ताकि अन्य कार्यक्रमों को पता चले कि उन्हें कहां पहुंचाया जाए। क्लाइंट सॉकेट कॉल bind() पर कॉल करें लेकिन लगभग कभी नहीं करते क्योंकि बहुत अधिक बिंदु नहीं है। यदि कोई सॉकेट bind() पर कॉल नहीं करता है तो ओएस इसके लिए केवल एक क्षणिक बंदरगाह चुन देगा, जो ग्राहकों के लिए ठीक है क्योंकि वे कॉल कर रहे हैं; कोई भी उन्हें कॉल करने के लिए की आवश्यकता है।

सर्वर सॉकेट listen() पर कॉल करें। यह अन्य उत्तरों में बहुत अच्छी तरह से समझाया गया था।

सर्वर सॉकेट accept() पर कॉल करें और मुझे लगता है कि यह आपके प्रश्न का क्रूक्स है क्योंकि यह पहले थोड़ा रहस्यमय है। समझने की महत्वपूर्ण बात यह है कि accept() पर कॉल करने से कर्नेल नया सॉकेट वापस भेज देगा। यह अब मूल श्रवण सॉकेट से अलग है और यह है कि आपका सर्वर अपने सहकर्मियों के साथ संवाद करने के लिए क्या उपयोग करेगा।

स्वीकार्य कनेक्शन यह सुन रहा है कि सुनवाई सॉकेट कैसे सुनती है, यह समझने की कुंजी यह है कि टीसीपी कनेक्शन 4-टुपल (1) स्थानीय पते (2) स्थानीय बंदरगाह (3) विदेशी पर निर्भर करता है पता (4) विदेशी बंदरगाह। ये एक अद्वितीय कनेक्शन परिभाषित करते हैं। accept() से पहले नई सॉकेट को पास कर दिया गया, कर्नेल ने विभिन्न मानकों को बनाने के लिए इन मानों का उपयोग किया ताकि टीसीपी/आईपी स्टैक के सहयोग से इस ट्यूपल के साथ सभी ट्रैफिक जुड़े सॉकेट पर जाएंगे। भले ही आपके सर्वर के स्थानीय पते के साथ हजारों कनेक्शन हो सकते हैं 1 9 2.168.1.100 पोर्ट 80, पता और बंदरगाह का क्लाइंट संयोजन हमेशा अलग होगा और इस प्रकार ट्यूपल हमेशा अद्वितीय होगा।

+0

यह इंगित करना अच्छा है कि सर्वर वास्तव में _multiple_ सॉकेट पर काम करता है: सुनने के लिए एक स्थानीय, और सहकर्मी संचार के लिए स्वीकार्य ग्राहकों के लिए दूरस्थ। – qweruiop

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