2011-01-11 11 views
10

मैं QTcpSocket::waitForBytesWritten() के व्यवहार पर थोड़ा उलझन में हूं ...QTcpSocket का व्यवहार :: waitForBytesWritten?

यह फ़ंक्शन कब तक ब्लॉक करता है?

  • जब तक टीसीपी पर संचरण के लिए ओएस के आंतरिक बफर को डेटा लिखा नहीं जाता है?
  • जब तक डेटा भौतिक रूप से टीसीपी पैकेट में परिवर्तित नहीं हो जाता है और भेजा जाता है?
  • जब तक पूरा डेटा प्रसारित नहीं हो जाता है और रिमोट क्लाइंट स्वीकार करता है कि सभी पैकेट प्राप्त हुए हैं?

मैंने प्रलेखन को देखा, लेकिन यह बहुत स्पष्ट प्रतीत नहीं हुआ।

उत्तर

7

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

यदि आपको रिमोट साइड को हमेशा के लिए अवरुद्ध करने से बचने की आवश्यकता है, तो आपको इसके बजाय QIODevice::bytesWritten सिग्नल का इंतजार करना चाहिए और अन्य काम करने के लिए ईवेंट लूप पर वापस जाना चाहिए, या बस उपयुक्त टाइमआउट सेट करना चाहिए। आम तौर पर, रिमोट साइड आपको हमेशा कुछ स्तर पर अवरुद्ध कर सकता है - यानी, यह आपके स्थानीय ओएस बफर को भरने, एके से इंकार कर सकता है, जिस बिंदु पर यह क्यूटी से ओएस तक नहीं बनायेगा; इससे कोई फर्क नहीं पड़ता कि waitForBytesWritten() किस स्तर पर है, इसे हमेशा अवरुद्ध किया जा सकता है।

जैसे, bytesWritten और waitForBytesWritten() केवल आंकड़ों का स्रोत रुके इस्तेमाल किया जाना चाहिए - अर्थात यदि आप सॉकेट के लिए डेटा के 1G गुजर एक तंग पाश में सभी को एक बार जाने के लिए थे, तो आप यह बफरिंग खत्म हो सकता है प्रक्रिया में और स्मृति से बाहर चल रहा है। bytesWritten सिग्नल के साथ अतिरिक्त पठन/लिखने को ट्रिगर करके, आप इस मुद्दे से बच सकते हैं।

+0

मुझे रसीद की पावती की आवश्यकता नहीं है। मैं वास्तव में * चाहता हूं कि वह स्थिति से बचें जहां ग्राहक एसीके भेजने के इंतजार कर आवेदन में देरी कर सकता है। –

+1

@ जॉर्ज: उत्तर अपडेट किया गया :) – bdonlan

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

  • कोई संबंधित समस्या नहीं^_^