2010-12-29 22 views
20

अन्य स्टैक ओवरफ़्लो प्रविष्टियों और boost::asio दस्तावेज़ों को पढ़ने से, मैंने पुष्टि की है कि कोई सिंक्रोनस एएसआईओ पढ़ने/लिखने वाली कॉल नहीं है जो कॉल के पैरामीटर के रूप में उपयोग में आसान टाइमआउट भी प्रदान करती है।सी ++ बूस्ट एएसआईओ: टाइमआउट के साथ कैसे पढ़ना/लिखना है?

मैं एक पुराने स्कूल लिनक्स सॉकेट एप्लिकेशन को चुनने के बीच में हूं (2) कॉल जो टाइमआउट्स को नियोजित करता है, और मुझे इसे कम या कम करने की आवश्यकता है।

तो boost::asio में ऐसा करने का सबसे अच्छा तरीका क्या है? एएसओ दस्तावेज को देखते हुए, टाइमर के साथ विभिन्न चीजों के कई भ्रमित उदाहरण हैं, लेकिन मैं काफी उलझन में हूं।

मुझे इसका एक सरल-पढ़ने वाला उदाहरण देखना अच्छा लगेगा: सॉकेट से पढ़ें, लेकिन अधिकतम X सेकंड के लिए प्रतीक्षा करें जिसके बाद फ़ंक्शन या तो कुछ भी नहीं लौटाता है, या जो कुछ भी सक्षम था उसके साथ लौटाता है टाइमआउट की समयसीमा समाप्त होने से पहले सॉकेट से पढ़ने के लिए।

+3

क्या आप कृपया इस उदाहरण के बारे में भ्रमित करने के बारे में विस्तार से बता सकते हैं: http://think-async.com/Asio/asio-1.4.7/src/examples/timeouts/blocking_tcp_client।सीपीपी - आवश्यक तर्क यह है कि, आप 2 एसिंक कार्यों को प्रेषित करते हैं, एक पढ़ा/लिखते हैं और दूसरा समय-समय पर पढ़ता है यदि रीड/राइट रिटर्न पहले आप डेडलाइन टाइमर को मार देते हैं, यदि समय सीमा टाइमर तर्क देता है तो पढ़ना/लिखना है अभी भी बकाया है - वहां से आप अपने टाइम-आउट तर्क के साथ आगे बढ़ते हैं। बहुत ही सरल –

+2

एक कोने का मामला है जो एचएफ नेटवर्किंग में उत्पन्न हो सकता है जो कॉलबैक की कतार से संबंधित है। टाइमआउट सीबी कतारबद्ध है, तो पढ़ना/लिखना कतारबद्ध है। आप टाइमआउट सीबी का सामना करते हैं और समय-समय पर तर्क निष्पादित करना शुरू करते हैं जब वास्तविकता में पढ़ा/लिखना पूरा हो गया था, मैंने देखा है कि एक संभावित समाधान डबल चेक लॉक के समान कुछ है - संक्षेप में पहली बार टाइमआउट लौटने पर एक माध्यमिक टाइमआउट करें, लेकिन फिर यह वही समस्या है यदि दूसरी टाइमआउट के बाद पढ़ा/लिखना कतारबद्ध है ... –

+2

बस याद रखें कि टाइमआउट एक कठिन स्थिति है, आप कह रहे हैं कि मुझे कुछ निश्चित मात्रा में कुछ नहीं मिलता है समय, मैं कुछ विशिष्ट करूँगा - इसमें यह तथ्य शामिल है कि पढ़ना/लिखना पहले से ही हो सकता है और आपके रास्ते पर है, यह इस तथ्य को नहीं बदलेगा कि आपने इसे अभी तक प्राप्त नहीं किया है। –

उत्तर

6

इसे एएसओ मेलिंग सूचियों पर लाया गया है, इस सुविधा का अनुरोध करने के लिए ticket भी है। संक्षेप में, यदि आप टाइमआउट और रद्दीकरण की इच्छा रखते हैं तो एसिंक्रोनस विधियों का उपयोग करने का सुझाव दिया जाता है।


आप अतुल्यकालिक तरीकों को परिवर्तित नहीं कर सकते हैं, तो आप SO_RCVTIMEO और SO_SNDTIMEO सॉकेट विकल्पों की कोशिश हो सकती है। उन्हें setsockopt के साथ सेट किया जा सकता है, वर्णनकर्ता को boost::asio::ip::tcp::socket::native विधि से प्राप्त किया जा सकता है। man 7 socket आदमी पेज

SO_RCVTIMEO और SO_SNDTIMEO प्राप्त या समय समाप्ति भेजने निर्दिष्ट एक त्रुटि की रिपोर्ट करने तक कहते हैं। तर्क एक संरचना टाइमवल है। यदि कोई इनपुट या आउटपुट समय की अवधि के लिए फ़ंक्शन ब्लॉक, और डेटा भेजा गया है या प्राप्त किया गया है, तो उस फ़ंक्शन का रिटर्न मान स्थानांतरित डेटा की मात्रा होगी; यदि डेटा स्थानांतरित कर दिया गया है और टाइमआउट तक पहुंच गया है तो -1 इरनो सेट के साथ पर वापस आ गया है या EWOULDBLOCK जैसे सॉकेट को पर निर्दिष्ट किया गया था, नॉन-अवरुद्ध हो। यदि टाइमआउट शून्य पर सेट है (डिफ़ॉल्ट) तो ऑपरेशन कभी भी समय-समय पर नहीं होगा। टाइमआउट केवल सिस्टम कॉल के लिए प्रभाव डालता है जो सॉकेट I/O (उदा।, पढ़ें (2), recvmsg (2), भेजें (2), sendmsg (2)); समय समाप्ति का चयन करें (2), सर्वेक्षण (2), epoll_wait के लिए कोई प्रभाव नहीं (2), आदि

+1

क्या आपने अनुरोध के लिए सीएच की प्रतिक्रिया पढ़ी? एएसआईओ सी ++ में ओएस कार्यक्षमता को दोहराता है, अगर आप किसी प्रकार की टाइम-आउट कार्यक्षमता को पुनः प्राप्त करते हैं, तो आप बिट-एन-टुकड़े एएसआईओ प्रदान करते हुए इसे लागू करने के लिए स्वागत से अधिक हैं। –

5

मैं कुछ asio docs इस्तेमाल किया यह उत्पादन करने के लिए:

class TimeoutAdjust 
{ 
public: 
    TimeoutAdjust(unsigned int dwTimeout) : m_dwTimeout(dwTimeout) {}; 

    template<class Protocol> 
    int level(const Protocol& p) const {return SOL_SOCKET;} 

    template<class Protocol> 
    int name(const Protocol& p) const {return SO_SNDTIMEO;} 

    template<class Protocol> 
    const void* data(const Protocol& p) const {return &m_dwTimeout;} 

    template<class Protocol> 
    size_t size(const Protocol& p) const {return sizeof(m_dwTimeout);} 
private: 
    unsigned int m_dwTimeout; 
}; 

उपयोग:

TimeoutAdjust adjust(5000); 
sSocket.set_option(adjust); 

मैंने इसे डीबग किया, और ऐसा लगता है कि यह क्या माना जाता है।

+1

जो मैंने यहां पढ़ा है वह है कि 'SO_SNDTIMEO'' unsigned int 'की बजाय' टाइमवल 'लेता है। http://linux.die.net/man/7/socket – updogliu

+0

आह, एमएस दस्तावेज़ SO_SNDTIMEO के लिए एक DWORD का उपयोग करते हैं। ऐसा लगता है कि टाइमवल लंबी चींटियों की एक जोड़ी है, इसलिए पाठक सावधान रहें। एमएस दस्तावेज़: http://msdn.microsoft.com/en-ca/library/windows/desktop/ms740532(v=vs.85).aspx – ArtHare

+2

उपरोक्त कोड का उपयोग करने के बाद मुझे अपवाद मिल रहा है अपवाद: set_option: अमान्य तर्क। अगर आपके पास कुछ संदर्भ कोड है तो कृपया इसे साझा करें। – asim

संबंधित मुद्दे