Похоже, что единственный способ избежать этого поведения - закрыть сокет (неименованный сервер каналов) и открыть его снова, как только вы получите достаточное количество данных. Также обратите внимание, что просто закрытие сокета и использование одного и того же экземпляра (например, сокета, созданного в стеке) вызвали у меня много проблем.
Я делаю это следующий способ:
На стороне отправителя у вас есть:
dataSocket->write((char*)data, sizeof(data));
dataSocket->disconnectFromServer();
и на стороне клиента:
void LocalSocketClient::requestNewFrame()
{
if (socket) {
socket->disconnect();
socket->deleteLater();
}
socket = new QLocalSocket();
dataStream.setDevice(socket);
connect(socket, &QLocalSocket::disconnected, this, &LocalSocketClient::requestNewFrame);
connect(socket, &QLocalSocket::readyRead, this, &LocalSocketClient::readSocket);
socket->connectToServer(NAMED_PIPE_NAME, QIODevice::ReadOnly);
}
void LocalSocketClient::readSocket()
{
if(dataStream.readRawData((char*)¤tFrame, sizeof(currentFrame)) > 0) {
}
}
где currentFrame известен структурой с заранее определенным ваш данные.
Это не самое элегантное решение для меня, я все еще изучаю, как избежать бесконечных операций new/deleteLater. Но без них я получал случайные ошибки записи на стороне отправителя (похоже, что цикл событий Qt удалял дескриптор сокета, когда он был закрыт, а не удалялся, испортил личные данные сокета)