मेरे पास दो क्यूटी ऐप्स हैं। एक ऐप को एक बड़ा डेटा रखने के लिए माना जा सकता है और यह हर दूसरे दूसरे एप्लिकेशन में लगभग 10 केबी डेटा खंड भेजता है।QTcpSocket कभी-कभी डेटा नहीं भेजता
इससे पहले मैंने डेटा संचारित करने के लिए QUDPSocket का उपयोग करने की कोशिश की लेकिन एमटीयू की लगभग 2-5K की सीमा के कारण और डेटा को विभाजित करने और फिर से जोड़ने की आवश्यकता है, मैंने QTcpSocket पर स्विच किया।
कभी-कभी डेटा QTcpSocket के साथ सही ढंग से भेजा जाता है (विशेष रूप से यदि मैं डेटा को हर बार ~ हर 100 एमएस लिखता हूं) लेकिन कभी-कभी डेटा बिल्कुल नहीं भेजा जाता है। 5 सेकंड के बाद भी नहीं। और कभी-कभी कई डेटा भाग आंतरिक रूप से लंबी अवधि (कई सेकंड) के लिए buffered होते हैं और फिर एक साथ भेजा जाता है।
m_socket = new QTcpSocket(this);
m_socket->connectToHost(QHostAddress::LocalHost, 45454);
sendDataEverySec()
{
QByteArray datagram(10000, 'a');
qint64 len = m_socket->write(datagram);
if(len != datagram.size())
qDebug() << "Error"; //this NEVER occurs in MY case.
m_socket->flush();
}
रिसीवर पक्ष पर, मैं readyRead
सिग्नल का उपयोग पता करने के लिए जब डेटा आ गया है।
मैं कैसे सुनिश्चित कर सकता हूं कि डेटा तुरंत भेजा जाए? क्या मैं जो करने की कोशिश कर रहा हूं उसके लिए कोई बेहतर विकल्प है?
संपादित करें :: जब मैं 1 सेकंड के लंबे अंतराल के बाद लिख रहा हूं, तो मुझे प्रत्येक बार प्रेषक डेटा भेजने पर रिसीवर पक्ष पर "QAbstractSocket::SocketTimeoutError"
प्राप्त होता है। अगर प्रेषक अक्सर डेटा लिखता है तो यह त्रुटि प्राप्त नहीं होती है।
क्या डेटा ठीक स्ट्रीम करने के लिए QTcpSocket का उपयोग करना ठीक है ????
संपादित 2: रिसीवर पक्ष पर, जब readyRead
सिग्नल उत्सर्जित होता है, तो मैं फिर से while(m_socket->waitForReadyRead(500))
की जांच कर रहा था और मुझे "QAbstractSocket::SocketTimeoutError"
मिल रहा था। इसके अलावा, यह चेक एकल हिस्सों को वितरित करने से रोक रही थी।
दस्तावेज़ों के माध्यम से जाने के बाद, ऐसा लगता है कि नया डेटा उपलब्ध होने पर readyRead
लगातार उत्सर्जित किया जाएगा, इसलिए waitForReadyRead
की आवश्यकता नहीं है।
मुझे सभी डेटा भेजा जा रहा है लेकिन अभी भी डेटा तुरंत नहीं आ रहा है। कभी-कभी दो-तीन भाग मर्ज किए जाते हैं। डेटा पढ़ने आदि में रिसीवर पक्ष पर देरी की वजह से यह
क्या आप सेट सॉकेटऑप्शन एपीआई में QAbstractSocket :: LowDelayOption ध्वज सेट करने का प्रयास कर सकते हैं? – Kunal
@ कुनल, मैंने बिना किसी सफलता के LowDelayOption और KeepAliveOption दोनों की कोशिश की।दिलचस्प है जैसे प्रेषक डेटा भेजता है, रिसीवर एक "QAbstractSocket :: सॉकेटटाइमआउट त्रुटि" दिखाता है। यह 1 सेकंड के अंतराल पर डेटा लिखने पर होता है। –
मुझे विश्वास है कि समस्या प्राप्त करने वाले पक्ष में निहित है। कृपया हमें दिखाएं कि आप आने वाले कनेक्शन कैसे संभालेंगे। – Koying