मैं एक बंद सॉकेट के लिए परीक्षण करने की कोशिश कर रहा हूं जिसे SIGPIPE
प्रेरित करने के लिए डबल प्रेषण की विलंबता हिट किए बिना सहकर्मी द्वारा बंद कर दिया गया है।एक बंद सॉकेट के लिए परीक्षण
यहां धारणाओं में से एक यह है कि बंद होने पर सॉकेट को अंतिम लिखने/भेजने के तुरंत बाद सहकर्मी द्वारा बंद कर दिया गया था। समय-समय पर बंद होने जैसी वास्तविक त्रुटियों को कोड में कहीं और निपटाया जाता है।
यदि सॉकेट अभी भी खुला है, तो 0 या अधिक बाइट डेटा होंगे जो मैं वास्तव में सॉकेट बफर से बाहर नहीं हटाना चाहता हूं।
मैं सोच रहा था कि सॉकेट अभी भी कनेक्ट है या नहीं, यह निर्धारित करने के लिए मैं int ret = recv(sockfd, buf, 1, MSG_DONTWAIT | MSG_PEEK);
पर कॉल कर सकता हूं। यदि यह कनेक्ट है लेकिन बफर में कोई डेटा नहीं है तो मुझे -1
errno == EAGAIN
के साथ वापसी होगी और पुन: उपयोग के लिए सॉकफ़ेड वापस कर देगा। अगर इसे सहकर्मी द्वारा बंद कर दिया गया है तो मुझे ret == 0
मिलेगा और एक नया कनेक्शन खोल देगा।
मैंने इसका परीक्षण किया है और यह काम करने के लिए लगता है। हालांकि, मुझे संदेह है कि जब मैं अपने डेटा के आखिरी बिट को पुन: प्राप्त करता हूं और जब सहकर्मी FIN
आता है तो मुझे एक छोटी सी खिड़की होती है जिसमें मुझे अपने परीक्षण recv
से झूठी-सकारात्मक EAGAIN
मिल सकता है।
क्या यह मुझे काटने जा रहा है, या ऐसा करने का एक बेहतर तरीका है?
एक वैकल्पिक तरीका चुनिंदा() (या पोल()) है, क्योंकि यह एक एफडी दोनों आरएफओ को पढ़ने और लिखने के लिए नियंत्रित कर सकता है, लेकिन मुझे नहीं पता कि यह वास्तव में एफआईएन समय के बारे में आपकी समस्या का समाधान करता है या नहीं। –
@Giuseppe: नहीं, मुझे नहीं लगता कि चयन समय की समस्या को हल करेगा। –