accept() ब्लॉक, जब तक एक और कनेक्शन नहीं बनाया जाता है और sockfd को वापस कर देता है, दोनों पक्षों को संवाद कर सकता है। लेकिन ऐसा accept() क्यों है जो ब्लॉक करता है, जब पहली चीज जो की जाती है वह तीन तरह से हाथ मिलाना है। और हाथ मिलाना accept() द्वारा नहीं, बल्कि listen() द्वारा किया जाता है। इसलिए मैं listen() के बजाय accept() को ब्लॉक करने की अपेक्षा करूंगा, क्योंकि यह सबसे पहले TCP में शामिल है। मुझे पता है कि कर्नेल आने वाले कनेक्शनों की कुछ कतारबद्ध करता है, लेकिन फिर भी इसमें शामिल पहला कार्य listen() है, फिर कनेक्शन को कतार में accept() पर ले जाया जाता है। इसलिए जब मैं पहला कनेक्शन करता हूं, listen() 3whs करेगा, और सर्वर accpet() में ब्लॉक कर देगा। तो दूसरा कनेक्शन एक और 3whs नहीं कर सकता, क्योंकि सर्वर वापस listen() पर नहीं जाता है, जो 3whs करता है? या क्यों accept() ब्लॉक करता है और listen() को नहीं?

0
milanHrabos 12 जिंदा 2021, 20:52
मैंने listen() फ़ंक्शन के व्यवहार को बदलने के बारे में कुछ नहीं कहा (इसलिए यह नहीं connfd को accept() के रूप में लौटाएगा), यह केवल कनेक्शन को संसाधित करेगा सामान्य रूप से accept() तक। लेकिन स्वीकार करें () टीसीपी में शामिल पहला फ़ंक्शन नहीं है जैसा कि सुनो () है। इससे मुझे कोई मतलब नहीं है
 – 
milanHrabos
12 जिंदा 2021, 21:02
जैसा कि मैंने कहा, सुनो ब्लॉक हो जाएगा, नया कनेक्शन आ गया है, 2whs हो गया है, प्रक्रिया स्वीकार () के साथ होगी। कार्यक्षमता वैसी ही है जैसी अभी है, लेकिन नए कनेक्शन के साथ पहली मुठभेड़ स्वीकार करने के बजाय सुनी जाएगी, क्योंकि स्वीकार 3whs निष्पादित नहीं करता है। तो वर्तमान मॉडल में, यह मेरे लिए कोई मतलब नहीं है, क्योंकि यदि ब्लॉक स्वीकार करते हैं, तो नया कनेक्शन 3whs नहीं कर सकता क्योंकि वह सुनता है और स्वीकार नहीं करता है
 – 
milanHrabos
12 जिंदा 2021, 21:13

1 उत्तर

सबसे बढ़िया उत्तर

listen() और accept() दो पूरी तरह से अलग ऑपरेशन हैं। वे कैसे काम करते हैं, इसकी आपकी समझ गलत है।

listen() केवल सुनने वाले सॉकेट के बैकलॉग को सेट करता है और बाउंड पोर्ट को खोलता है, ताकि क्लाइंट सॉकेट से जुड़ना शुरू कर सकें। वह उद्घाटन एक बहुत तेज़ ऑपरेशन है, इसे अवरुद्ध करने के बारे में चिंता करने की कोई आवश्यकता नहीं है।

listen() द्वारा 3-तरफा हैंडशेक नहीं किया जाता है। यह कर्नेल द्वारा किया जाता है जब क्लाइंट खुले पोर्ट से कनेक्ट करने का प्रयास करता है और सुनने वाले सॉकेट के बैकलॉग में रखा जाता है। प्रत्येक नया क्लाइंट कनेक्शन अपना स्वयं का 3-तरफा हैंडशेक करता है।

एक बार क्लाइंट कनेक्शन पूरी तरह से हाथ मिलाने के बाद, उस कनेक्शन को बैकलॉग से निकालने के लिए accept() के लिए उपलब्ध कराया जाता है। accept() ब्लॉक (या, यदि आप एक नॉन-ब्लॉकिंग लिसनिंग सॉकेट का उपयोग करते हैं, तो accept() सफल होता है) केवल तभी जब कोई नया क्लाइंट कनेक्शन बाद के संचार के लिए उपलब्ध हो।

आप लिसनिंग पोर्ट को खोलने के लिए listen() को केवल 1 बार कॉल करते हैं, बस इतना ही करता है। फिर आपको उस प्रत्येक क्लाइंट के लिए accept() पर कॉल करना होगा जिसके साथ आप संवाद करना चाहते हैं। इसीलिए accept() ब्लॉक करता है और listen() नहीं करता है।

0
Remy Lebeau 12 जिंदा 2021, 22:05
यदि कर्नेल 3whs करता है, तो कब? क्या यह कॉल सुनने और स्वीकार करने के बीच, या स्वीकार करते समय, या कब किया जाता है?
 – 
milanHrabos
12 जिंदा 2021, 22:11
पोर्ट खुला होने पर कर्नेल 2whs कर सकता है? यह सुनने के बाद कौन सा है?
 – 
milanHrabos
12 जिंदा 2021, 22:12
हां, listen() के बाहर निकलने के बाद किसी भी समय 3-वे हैंडशेक किया जा सकता है। लेकिन हैंडशेक कैसे प्रबंधित किया जाता है यह कर्नेल पर निर्भर करता है। जब कोई नया कनेक्शन आता है, तो कुछ कर्नेल तुरंत 3-तरफा हैंडशेक पूरा करते हैं और कनेक्शन को accept() से खींचने के लिए एक अलग कतार में डाल देते हैं। कुछ कर्नेल केवल आंशिक हैंडशेक करते हैं और फिर इसे तभी समाप्त करते हैं जब accept() वास्तव में कॉल किया जाता है।
 – 
Remy Lebeau
12 जिंदा 2021, 22:20
लेकिन, आपको वास्तव में उन विवरणों के बारे में चिंता करने की ज़रूरत नहीं है, कर्नेल उन्हें आपके लिए संभालता है। आपको केवल अपने आप को चिंता करने की ज़रूरत है कि चुने हुए पोर्ट को खोलने के लिए listen() को कॉल करें, और उससे कनेक्शन प्राप्त करने के लिए accept() को कॉल करें। बाकी आपके लिए पर्दे के पीछे से संभाला जाता है। अगर आप नहीं चाहते कि accept() आपके कोड को ब्लॉक कर दे, तो उसे वर्कर थ्रेड पर ले जाएं, या नॉन-ब्लॉकिंग लिसनिंग सॉकेट का उपयोग करें।
 – 
Remy Lebeau
12 जिंदा 2021, 22:21
यह 3whs के समय का उत्तर नहीं है। आपने कहा कि यह कर्नेल करता है, लेकिन आप खुद नहीं जानते कि यह कब करता है
 – 
milanHrabos
12 जिंदा 2021, 22:36