Mam QTcpSocket i czytam w pętli. Za każdym razem pełny pakiet został przeczytany, czy nastąpił błąd, ręcznie sprawdzić stan gniazda wewnątrz pętli, z:QTcpSocket stan zawsze podłączony, nawet odłączenie przewodu ethernetowego
while(true){
if(socket->state()==QAbstractSocket::ConnectedState){
qDebug()<<"Socket status: connected. Looking for packets...";
if(socket->waitForReadyRead(2000)){
//...
}
Kiedy wykonać de program, po podłączeniu i pętla zaczyna, zawsze drukuje qDebug()<<"Socket status: connected. Looking for packets..."
; a następnie utknąć w waitForReadyRead
, aż niektóre dane będą gotowe do odczytania.
Problem polega na tym, że rozłączenia nie są wykrywane. Jeśli odłączę się od sieci od opcji systemu operacyjnego, lub nawet jeśli odłączyłem przewód ethernetowy, zachowuje się on tak samo: Stan gniazda jest równy QAbstractSocket::ConnectedStat
e, więc trwa, ale bez otrzymywania niczego oczywiście.
Próbowałem też wykryć rozłączenia łączące disconnected()
sygnał (po podłączeniu pięści) do funkcji Ponowne łączenie:
// 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();
}
Ale sygnał nigdy nie jest emitowane, ponieważ kod ten nie jest wykonywany. Co jest logiczne, ponieważ wygląda na to, że stan gniazda jest zawsze ConnectedState
.
Jeśli ponownie podłączę, połączenie zostanie przywrócone i zacznie otrzymywać dane ponownie, ale chcę wykryć rozłączenia, aby pokazać "Rozłączony" w GUI.
Dlaczego QTcpSocket zachowuje się w ten sposób i jak mogę rozwiązać ten problem?
EDIT: Tworzę gniazdo w konstruktorze klasy, a następnie inicjalizacji wywołanie funkcji prepareSocket:
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;
}
Jak długo czekałeś z odłączonym kablem? – Mat
Nie wiem ... 10 sekund? Znacznie mniej było konieczne dla gniazd POSIX, aby ustalić, że zostały rozłączone. Ile powinienem czekać? –
Limity czasu TCP są o wiele wyższe. Poczekaj przynajmniej kilka minut. – Mat