सामान्य प्रोग्रामिंग: सर्वर सॉकेट स्वीकार() विधि में वास्तव में क्या होता है। निम्न स्तर पर सर्वर सॉकेट क्लाइंट सॉकेट से अलग कैसे होते हैं?सर्वर बनाम क्लाइंट सॉकेट (निम्न स्तर का विवरण)?
उत्तर
सबसे पहले, सर्वर सॉकेट आमतौर पर प्रसिद्ध नामों (बंदरगाहों, इस मामले में) से बंधे होते हैं और वे listen()
के साथ स्वयं को स्थापित करते हैं। यही वह जगह है जहां वास्तविक अंतर होता है, क्योंकि क्लाइंट सॉकेट खुद को connect()
के साथ स्थापित करते हैं। सॉकेट पर listen()
को कॉल करने से कर्नेल के टीसीपी/आईपी कार्यान्वयन सॉकेट के बाध्य नाम (पोर्ट) को भेजे गए कनेक्शन स्वीकार करने के लिए होता है। ऐसा होगा कि आपने कभी accept()
पर कॉल किया है या नहीं।
accept()
बस आपके सर्वर को आपके सुनने की सॉकेट से जुड़े क्लाइंट सॉकेट तक पहुंचने और उससे संपर्क करने का एक तरीका प्रदान करता है।
प्रोग्रामिंग भाषा निर्दिष्ट किए बिना अपने प्रश्न का पूरी तरह उत्तर देना मुश्किल है। मैं अजगर के संबंध में जवाब दूंगा, क्योंकि मुझे पता है कि जवाब प्रतिनिधि हो सकता है।
यदि s
socket
ऑब्जेक्ट है, तो एक सर्वर पहले s.bind(('',12345))
पर कॉल करके बंदरगाह से बांधता है। यह सर्वर मोड में एक सॉकेट बनाता है। यह पोर्ट 12345 पर डेटा पकड़ने के लिए तैयार है।
फिर कोई s.listen(10)
पर कॉल करता है। यह सर्वर मोड में सॉकेट फेंकता है। इसका मतलब है कि इस सॉकेट द्वारा एक कनेक्शन के लिए अनुरोध प्राप्त होगा (एक समय में 10 लंबित अनुरोध)।
जब तक हम s.accept()
तक पहुंचते हैं, तो ऑपरेटिंग सिस्टम पहले ही जानता है कि हम पोर्ट 12345 पर सुन रहे हैं। s.accept()
केवल यही कहता है कि हम जो अनुरोध प्राप्त करते हैं उसके साथ हम क्या करने जा रहे हैं। पायथन में, s.accept()
(connection,address)
लौटाएगा जहां कनेक्शन दूसरे पोर्ट के माध्यम से कनेक्शन है। इस मामले में, connection
क्लाइंट खोले गए सॉकेट ऑब्जेक्ट से बहुत अलग नहीं है। यह यहां से उचित रूप से सममित है।
यदि आप वास्तव में रुचि रखते हैं, तो मैं आपको TCP/IP Illustrated, Volume 2 पढ़ने की सलाह दूंगा। यदि आप चाहते हैं एक कम जवाब है, तो "हिम्मत में" अगर:
- सर्वर सॉकेट प्रसिद्ध अंतिम बिंदुओं को बाध्य कर रहे हैं, जहां एक अंत बिंदु (प्रोटोकॉल, पता, पोर्ट) टपल है। एंडपॉइंट
socket()
सिस्टम कॉल में निर्दिष्ट प्रोटोकॉल द्वारा बनाया गया है औरbind()
सिस्टम कॉल में निर्दिष्ट पता जानकारी। - जब सर्वर
listen()
सिस्टम कॉल पर कॉल करता है, तो नेटवर्क स्टैक एक कतार बनाता है जिसमें लंबित कनेक्शन शामिल होते हैं। कतार के आकार के लिए एक संकेतbacklog
पैरामीटरlisten()
पर दिया गया है। - सर्वर फिर कतार से नया कनेक्शन खींचने के लिए
accept()
पर कॉल करता है। - क्लाइंट सॉकेट
connect()
पर कॉल में सर्वर एंडपॉइंट निर्दिष्ट करके सर्वर सॉकेट को संदेश भेजते हैं और फिरsend()
याwrite()
का उपयोग करके डेटा भेजते हैं। - जब ग्राहक
connect()
पर कॉल करता है, तो सर्वर-साइड कतार पर एक कनेक्शन धक्का दिया जाता है जहां यह सर्वर कनेक्शन स्वीकार करता है।
यह विवरण केवल टीसीपी/आईपी सॉकेट के लिए वास्तव में मान्य है। यूडीपी सॉकेट (अनिवार्य रूप से) कनेक्ट होने के बाद से यूडीपी मामला सरल और काफी अलग है।
कम स्तर पर सॉकेट केवल सॉकेट हैं चाहे वे किसी सर्वर या क्लाइंट एप्लिकेशन में उपयोग किए जा रहे हों या नहीं। सिस्टम में दो झूठ के बीच का अंतर प्रत्येक प्रकार के आवेदन को कॉल करता है।
सर्वर सॉकेट बंदरगाह से जुड़े होने के लिए bind()
पर कॉल करेगा। वे एक बंदरगाह से जुड़े रहना चाहते हैं ताकि अन्य कार्यक्रमों को पता चले कि उन्हें कहां पहुंचाया जाए। क्लाइंट सॉकेट कॉल bind()
पर कॉल करें लेकिन लगभग कभी नहीं करते क्योंकि बहुत अधिक बिंदु नहीं है। यदि कोई सॉकेट bind()
पर कॉल नहीं करता है तो ओएस इसके लिए केवल एक क्षणिक बंदरगाह चुन देगा, जो ग्राहकों के लिए ठीक है क्योंकि वे कॉल कर रहे हैं; कोई भी उन्हें कॉल करने के लिए की आवश्यकता है।
सर्वर सॉकेट listen()
पर कॉल करें। यह अन्य उत्तरों में बहुत अच्छी तरह से समझाया गया था।
सर्वर सॉकेट accept()
पर कॉल करें और मुझे लगता है कि यह आपके प्रश्न का क्रूक्स है क्योंकि यह पहले थोड़ा रहस्यमय है। समझने की महत्वपूर्ण बात यह है कि accept()
पर कॉल करने से कर्नेल नया सॉकेट वापस भेज देगा। यह अब मूल श्रवण सॉकेट से अलग है और यह है कि आपका सर्वर अपने सहकर्मियों के साथ संवाद करने के लिए क्या उपयोग करेगा।
स्वीकार्य कनेक्शन यह सुन रहा है कि सुनवाई सॉकेट कैसे सुनती है, यह समझने की कुंजी यह है कि टीसीपी कनेक्शन 4-टुपल (1) स्थानीय पते (2) स्थानीय बंदरगाह (3) विदेशी पर निर्भर करता है पता (4) विदेशी बंदरगाह। ये एक अद्वितीय कनेक्शन परिभाषित करते हैं। accept()
से पहले नई सॉकेट को पास कर दिया गया, कर्नेल ने विभिन्न मानकों को बनाने के लिए इन मानों का उपयोग किया ताकि टीसीपी/आईपी स्टैक के सहयोग से इस ट्यूपल के साथ सभी ट्रैफिक जुड़े सॉकेट पर जाएंगे। भले ही आपके सर्वर के स्थानीय पते के साथ हजारों कनेक्शन हो सकते हैं 1 9 2.168.1.100 पोर्ट 80, पता और बंदरगाह का क्लाइंट संयोजन हमेशा अलग होगा और इस प्रकार ट्यूपल हमेशा अद्वितीय होगा।
यह इंगित करना अच्छा है कि सर्वर वास्तव में _multiple_ सॉकेट पर काम करता है: सुनने के लिए एक स्थानीय, और सहकर्मी संचार के लिए स्वीकार्य ग्राहकों के लिए दूरस्थ। – qweruiop
- 1. एचडीएफ 5: निम्न स्तर बनाम निम्न स्तर इंटरफेस। h5py
- 2. निम्न स्तर का लुआ दुभाषिया
- 3. सॉकेट() सी क्लाइंट सर्वर अनुप्रयोग
- 4. सॉकेट - जावा क्लाइंट, सी # सर्वर
- 5. निम्न स्तर के डेटा संचार
- 6. निम्न स्तर के सामान्य बीएसडी सॉकेट से कम
- 7. निम्न स्तर हूकर
- 8. क्लाइंट बनाम सर्वर शब्दावली
- 9. सॉकेट प्रोग्रामिंग एकाधिक क्लाइंट एक सर्वर
- 10. जाओ विवरण कक्षा स्तर
- 11. निम्न स्तर जावास्क्रिप्ट क्या है?
- 12. सॉकेट बनाम। डब्ल्यूसीएफ
- 13. लुआ सॉकेट क्लाइंट
- 14. PHP सॉकेट सर्वर बनाम node.js: वेब चैट
- 15. एसक्यूएल सर्वर में कॉलम स्तर बनाम तालिका स्तर की बाधाएं?
- 16. सॉकेट आईओ सर्वर सर्वर
- 17. सर्वर सॉकेट Close_Wait
- 18. PHP सॉकेट बनाम स्ट्रीम
- 19. डिजाइन दस्तावेज़ (उच्च स्तर और निम्न स्तर के डिजाइन दस्तावेज़)
- 20. रीसेट सर्वर सॉकेट टाइमआउट
- 21. एंड्रॉइड - सर्वर सॉकेट
- 22. निम्न स्तर कंसोल इनपुट और पुनर्निर्देशन
- 23. एएसपी.नेट क्लाइंट बनाम सर्वर व्यू रेंडरिंग
- 24. सर्वर सॉकेट droid emulator
- 25. एंड्रॉइड - सॉकेट बनाम मतदान
- 26. निम्न स्तर की डब्ल्यूसीएफ त्रुटियों को कैसे संभालें?
- 27. एसक्यूएल सर्वर: मूल क्लाइंट बनाम ओडीबीसी?
- 28. सी # में निम्न स्तर कुंजीपटल हुक का उपयोग कर
- 29. आईफोन आईओएस 4 निम्न स्तर का कैमरा नियंत्रण?
- 30. ग्राहक सर्वर सॉकेट सुरक्षा
इसके अलावा, यदि आप विंडोज का उपयोग कर रहे हैं, तो Accept() के बारे में एमएसडीएन पृष्ठ भी अभ्यास में क्या होता है इसके बारे में अतिरिक्त जानकारी देता है: http://msdn.microsoft.com/en-us/library/ms737526(VS.85) .aspx – binarybob