मेरे पास एक QTcpSocket है और मैं एक लूप में पढ़ रहा हूं। हर बार एक पूर्ण पैकेट पढ़ कर दिया गया है, या कोई त्रुटि हुई है, मैं मैन्युअल सॉकेट की स्थिति पाश अंदर के साथ जांच,:QTcpSocket स्थिति हमेशा कनेक्ट होती है, यहां तक कि अनप्लगिंग ईथरनेट वायर
while(true){
if(socket->state()==QAbstractSocket::ConnectedState){
qDebug()<<"Socket status: connected. Looking for packets...";
if(socket->waitForReadyRead(2000)){
//...
}
जब मैं डी कार्यक्रम, एक बार जुड़े निष्पादित और पाश शुरू होता है, यह हमेशा qDebug()<<"Socket status: connected. Looking for packets..."
प्रिंट करता है; और उसके बाद waitForReadyRead
पर अटक जाता है जब तक कि कुछ डेटा पढ़ने के लिए तैयार नहीं होता है।
समस्या यह है कि डिस्कनेक्शन का पता नहीं लगाया गया है। यदि मैं ओएस विकल्पों से नेटवर्क से डिस्कनेक्ट करता हूं, या यदि मैं ईथरनेट तार को अनप्लग करता हूं, तो यह वही व्यवहार करता है: सॉकेट स्थिति QAbstractSocket::ConnectedStat
ई के बराबर होती है, इसलिए यह चलती है, लेकिन बिना किसी कोर्स के प्राप्त होती है।
मैं भी एक पुनः कनेक्ट कार्य करने के लिए (मुट्ठी कनेक्शन के बाद) disconnected()
संकेत जोड़ने डिस्कनेक्शन का पता लगाने की कोशिश की:
// Detect disconnection in order to reconnect
connect(socket, SIGNAL(disconnected()), this, SLOT(reconnect()));
void MyClass::reconnect(){
qDebug()<<"Signal DISCONNECTED emitted. Now trying to reconnect";
panelGUI->mostrarValueOffline();
socket->close();
prepareSocket((Global::directionIPSerialServer).toLocal8Bit().data(), 8008, socket);
qDebug()<<"Reconnected? Status: "<<socket->state();
}
लेकिन संकेत, उत्सर्जित कभी नहीं है क्योंकि यह कोड निष्पादित कभी नहीं किया गया है। जो तार्किक है, क्योंकि ऐसा लगता है कि सॉकेट स्थिति हमेशा ConnectedState
है।
यदि मैं दोबारा प्लग करता हूं, कनेक्शन बहाल हो जाता है और फिर डेटा प्राप्त करना शुरू होता है, लेकिन मैं GUI पर "डिस्कनेक्ट" दिखाने के लिए डिस्कनेक्शन का पता लगाना चाहता हूं।
QTcpSocket इस तरह से क्यों व्यवहार कर रहा है, और मैं इस समस्या को कैसे हल कर सकता हूं?
संपादित करें: मैं कक्षा निर्माता पर सॉकेट बना रहा हूं, और फिर बुला prepareSocket समारोह initialising:
socket = new QTcpSocket();
socket->moveToThread(this);
bool prepareSocket(QString address, int port, QTcpSocket *socket) {
socket->connectToHost(address, port);
if(!socket->waitForConnected(2000)){
qDebug()<<"Error creating socket: "<<socket->errorString();
sleep(1);
return false;
}
return true;
}
केबल अनप्लग किए गए आप कितने समय तक प्रतीक्षा करते थे? – Mat
पता नहीं ... 10 सेकंड? POSIX सॉकेट के लिए यह निर्धारित करने के लिए बहुत कम आवश्यक था कि वे डिस्कनेक्ट हो गए थे। मुझे कितना इंतजार करना चाहिए? –
टीसीपी टाइमआउट उस से ऊपर हैं। कम से कम कुछ मिनट के लिए प्रतीक्षा करें। – Mat