2011-07-20 21 views
5

मैं पठनीय सॉकेट खोजने और पढ़ने के लिए फ़ाइल डिस्क्रिप्टर का उपयोग करता हूं। कुछ कारणों से, एक सॉकेट जिसमें तार पर कोई डेटा नहीं है, पढ़ने के लिए चला जाता है और कभी वापस नहीं आता है। क्या टाइमआउट के बाद मुझे प्राप्त करने का कोई तरीका है?recv() विंडोज सॉकेट अनंत समय लेता है - टाइमआउट कैसे करें?

.. मैं विनसॉक पुस्तकालय का उपयोग कर रहा

उत्तर

9

http://tangentsoft.net/wskfaq/newbie.html#timeout

2,15 - मैं एक विनसॉक समारोह के लिए समय समाप्ति कैसे बदल सकता हूँ?

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

आप SO_SNDTIMEO और SO_RCVTIMEO setockopt() विकल्पों के साथ भेजें() और recv() टाइमआउट समायोजित कर सकते हैं। ।

अन्य विंसॉक फ़ंक्शंस के लिए, सॉकेट को पूरी तरह से अवरुद्ध करने से बचने का सबसे अच्छा समाधान है। गैर अवरुद्ध सॉकेट सभी पद्धतियों का तरीके प्रदान आप कस्टम समय समाप्ति का निर्माण करने के लिए:

Non-blocking sockets with select() – The fifth parameter to the select() function is a timeout value. 

Asynchronous sockets – Use the Windows API SetTimer(). 

Event objects – WSAWaitForMultipleEvents() has a timeout parameter. 

Waitable Timers – Call CreateWaitableTimers() to make a waitable timer, which you can then pass to a function like WSAEventSelect() along with your sockets: if none of the sockets is signalled before the timer goes off, the blocking function will return anyway. 

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