-->

Qt的5.2:QLocalServer接收复制readyRead信号(Qt 5.2: QLocalS

2019-10-19 07:56发布

我不解带设计一个简单的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->写(数据) 呼叫触发在服务器 (即使服务器端阅读了ReadAll呼吁所有数据) 复制readyRead。

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

Answer 1:

的语义QIODevice使得readyRead信号仅仅意味着有可能的数据可用于读取。 这并不意味着有一定的数据可用,这并不意味着特定的数据量是保证可用。 实现一定尽最大努力避免杂散信号,但他们可以自由地发出任意数量的“假”的。 这将是一个更糟糕的问题(一个bug,实际上!)如果readyRead信号被错过。

什么你应该做的是阅读,当你得到信号的任何数据是可用的。 就这样。 有绝对没有保证,你会得到在任何特定的“组块”的数据。 例如,如果一个连接的一端做了单一的,1K字节写入,该连接的另一端可以得到的任何数量的readyRead信号。

所有这一切都保证是,如果你只有当你得到一个读取数据readyRead信号,你不会错过任何数据-因此你不需要做任何地方读取,但一个插槽连接到readyRead信号。

所以,你看到的是完全确定。 您需要处理任何数量的数据是可用的,当一个readyRead火灾。 包括零个字节。



文章来源: Qt 5.2: QLocalServer receiving duplicated readyRead signals