QTcpSocketがあり、ループを読み込んでいます。完全なパケットが読み取られるたび、またはエラーが発生するたびに、ループ内のソケットのステータスを手動で確認します。
while(true){
if(socket->state()==QAbstractSocket::ConnectedState){
qDebug()<<"Socket status: connected. Looking for packets...";
if(socket->waitForReadyRead(2000)){
//...
}
de programを実行すると、接続されてループが開始されると、常にqDebug()<<"Socket status: connected. Looking for packets..."
;が出力されます。そして、waitForReadyRead
いくつかのデータを読み取る準備ができるまで立ち往生します。
問題は、切断が検出されないことです。OSオプションからネットワークを切断した場合、またはイーサネットワイヤを抜いた場合でも、同じように動作します。ソケットの状態はQAbstractSocket::ConnectedStat
eに等しいため、続行されますが、もちろん何も受信しません。
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関数の呼び出しを初期化しています:
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;
}