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

标签 c++ qt duplicates qlocalsocket qlocalserver

我对设计一个简单的 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/

相关文章:

c++ - 为什么 QPainter 不绘制到我的 QWidget?

c++ - 在 QString 中查找数字

qt - 在运行时更改和更新几何网格

sql - 仅选择非重复行 (SQL)

java - 在大文件Java中查找重复的行

c++ - 读取 GLSL 文件时获取垃圾字符

c++ - 如何获取模板模板参数的模板参数?

c++ - 从没有参数的函数返回整数数组

php - Contact Form 7 防止重复字段值提交

c++ - 我想使用 ofstream 在 cpp 中创建一个文本文件