2009-04-01 9 views
8

स्थिति: सर्वर कॉल स्वीकार करता है()। ग्राहक सर्वर पर एक SYN भेजता है। सर्वर को SYN मिलता है, और उसके बाद क्लाइंट को एक SYN/ACK भेजता है। हालांकि, ग्राहक अब लटकता/मर जाता है, इसलिए यह कभी भी एसीके को सर्वर पर वापस नहीं भेजता है।टीसीपी और पॉज़िक्स सॉकेट स्वीकार करते हैं() सेमेन्टिक्स

क्या होता है? स्वीकार करता है() जैसे ही यह SYN प्राप्त करता है, या क्लाइंट के एसीके लौटाए जाने तक ब्लॉक करता है? यदि यह अवरुद्ध करता है, तो क्या यह अंततः समय-समय पर होता है?

उत्तर

9

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

1

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

क्लाइंट से कनेक्शन के दौरान कोई त्रुटि उत्पन्न होने पर क्लाइंट से सर्वर से कनेक्ट होता है, तो मान त्रुटि सेट की जाएगी और एक अच्छा विचार लॉग या एक त्रुटि संदेश प्रदर्शित होगा। हालांकि, मैन पेजों को पढ़ना ज्यादातर मामलों में जानकारी का सबसे अच्छा स्रोत है।

2

यदि ग्राहक कभी एसीके नहीं भेजता है, तो स्वीकार करें() सॉकेट को गैर-अवरुद्ध चिह्नित करने पर या तो ब्लॉक को वापस या वापस कर देगा।

0

यदि कोई विफलता है, तो एक टाइमआउट क्योंकि एक हैंडशेक पूरा नहीं होता है, यह -1 लौटाएगा और इरनो सेट करेगा। मेरा मानना ​​है कि, मैन पेज को देखने के बाद, यह इकोनोबॉर्टेड के लिए गलत सेट करेगा।