gpt4 book ai didi

c++ - Qt 5.2 : QLocalServer receiving duplicated readyRead signals

转载 作者:行者123 更新时间:2023-11-30 04:08:35 25 4
gpt4 key购买 nike

我对设计一个简单的 QLocalServer-QLocalSocket IPC 系统的问题感到困惑。

QLocalServer 等待新连接并将信号连接到正确的插槽。

void CommandProcessor::onNewConnection()
{
QLocalSocket* pLocal = _server->nextPendingConnection();

connect(pLocal,SIGNAL(disconnected()),this,SLOT(onSocketDisconnected()));
connect(pLocal,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
connect(pLocal,SIGNAL(error(QLocalSocket::LocalSocketError)),this, SLOT(onSocketError(QLocalSocket::LocalSocketError)));

qDebug("Socket connected. addr=%p", pLocal);
}

The readyRead slot implementation is:

void CommandProcessor::onSocketReadyRead()
{
QLocalSocket* pLocalSocket = (QLocalSocket *) sender();
qDebug("SocketReadyRead. addr=%p", pLocalSocket);

QDataStream in(pLocalSocket);
in.setVersion(QDataStream::Qt_5_2);
pLocalSocket->readAll();


qDebug("%s pLocalSocket->bytesAvailable() = %d", Q_FUNC_INFO, pLocalSocket->bytesAvailable());
}

此 readAll 是有意完成的,以检查我如何按顺序获得两个 readyRead 信号(从同一个槽指针,我验证了这一点)。

客户端操作相当简单:

   QByteArray data;
QDataStream out(&data, QIODevice::ReadWrite);
out.setVersion(QDataStream::Qt_5_2);

cmd.toDataStream(out);

// write blocksize at first field

out.device()->seek(0);
out << data.size() - sizeof(BLOCKSIZE_T);
qint64 bw = _socket->write(data);

_socket->write(data) 调用会在服务器端触发重复的 readyRead(即使服务器端已使用 ReadAll 调用读取所有数据)。

我应该看哪里的任何指示?

最佳答案

QIODevice 的语义是这样的,readyRead 信号仅表示可能有数据可供读取。这并不意味着一定有数据可用,也不意味着一定有一定数量的数据可用。实现当然会尽最大努力避免虚假信号,但它们可以自由发出任意数量的“虚假”信号。如果错过了 readyRead 信号,那将是一个更糟糕的问题(实际上是一个错误!)。

您应该做的是在收到信号时读取任何可用的数据。就这样。绝对不能保证您将获得任何特定“分块”中的数据。例如,如果连接的一端执行单个 1kByte 写入,则连接的另一端可能会收到任意数量的 readyRead 信号。

可以保证的是,如果您在收到readyRead 信号时读取数据,您将不会错过任何数据 - 因此您不需要从连接到 readyRead 信号的插槽以外的任何地方读取数据。

所以,您所看到的完全没问题。当 readyRead 触发时,您需要处理任何数量的可用数据。包括零字节。

关于c++ - Qt 5.2 : QLocalServer receiving duplicated readyRead signals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com