Должен ли я получать все сообщения после отключения QLocalSocket?

У меня есть приложение на 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.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]