У меня есть приложение на c ++ / Qt в Windows, Linux и MacOSX, и у меня есть локальный клиент-серверный механизм, использующий Qt Local Server / Socket.
Когда сервер отказывает в соединении, я отправляю сообщение и закрываю сокет, используя QLocalSocket :: disconnectFromServer ()
Из документации я вижу
Если ожидающие записи данные ожидают, QLocalSocket войдет в ClosingState и будет ждать, пока все данные не будут записаны.
Так что на стороне клиента я подключаю сигнал QLocalSocket :: отсоединен и сделайте следующее в моем слоте
void MyClientClass::onSocketDisconnected()
{
qDebug() << "Socket disconnected";
socket->readAll();
//I do something with the data read
}
Но бывает, что иногда, в основном на медленных машинах с Linux (я пытаюсь использовать виртуальные машины только с одним процессором), я не получаю последнее сообщение, которое сервер отправляет непосредственно перед закрытием.
Почему это происходит? Это должно быть в отличие от документации, не так ли?
Есть ли какая-то мотивация, почему я заметил это только в Linux и MacOSX (где Qt использует доменные сокеты unix), и я не заметил это в Windows (где Qt использует каналы)?
Может быть, есть какая-то мотивация, связанная с доменными сокетами? Или я просто что-то не так понял?
Изменить: как написано в комментариях ниже, в тех случаях, когда я не получаю сообщение, также QLocalSocket::ClosingState
отсутствует, и я получаю непосредственно QLocalSocket::UnconnectedState
Изменить 2: как предложено в комментариях, я попробовал waitForReadyRead()
функция. я это сделал onSocketDisconnected()
а также onStateChanged()
когда государство переходит к QLocalSocket::ClosingState
или же QLocalSocket::UnconnectedState
, Когда я получу QLocalSocket::ClosingState
все идет хорошо, но проблема, как я уже говорил в последнем редакторе, заключается в том, что иногда QLocalSocket::ClosingState
пропал, отсутствует. В этом случае waitForReadyRead()
происходит сбой без ожидания тайм-аута, и у меня появляется предупреждение «QIODevice: read (QTcpSocket): устройство не открыто» (даже если я использую QLocalSocket
, может быть, предупреждающее сообщение не очень хорошо обновлено в источнике Qt). Кстати, я использую Qt5.7.
Задача ещё не решена.
Других решений пока нет …