1

我正在开发一个在本地服务器和客户端应用程序之间使用 IPC 的应用程序。它没有什么特别之处,因为它的结构类似于 Qt 文档和示例。

问题是客户端经常发送数据包并且从服务器本地套接字(NT 上的命名管道)连接/断开连接非常慢。所以我想要实现的是两个应用程序之间的“持久”连接。

客户端应用程序连接到本地服务器(QLocalServer)没有任何问题:

void IRtsClientImpl::ConnectToServer(const QString& name)
{   
    connect(_socket, SIGNAL(connected()), this,  SIGNAL(connected()));
    _blockSize = 0;
    _socket->abort();
    _socket->connectToServer(name, QIODevice::ReadWrite);
}

并以传统的 Qt 方式发送请求:

void IRtsClientImpl::SendRequest( quint8 cmd, const QVariant* const param_array, 
                                 unsigned int cParams )
{
    // Send data through socket

    QByteArray hdr(PROTO_BLK_HEADER_PROJ);
    QByteArray dataBlock;
    QDataStream out(&dataBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_5);

    quint8 command = cmd;

    out << blocksize_t(0)   // block size
        << hdr      // header
        << quint32(PROTO_VERSION_PROJ) // protocol version
        << command            // command
        << cParams;           // number of valid parameters

    for (unsigned int i = 0; i < cParams; ++i)
        out << param_array[i];

    // Write the current block size
    out.device()->seek(0);
    out << dataBlock.size() - sizeof(blocksize_t);
    _socket->write(dataBlock);
}

没问题。但诀窍在于服务器端的 readyRead() 信号。这是 readyRead() 处理槽的当前实现:

void IRtsServerImpl::onReadyRead()
{
    QDataStream in(_lsock);
    in.setVersion(QDataStream::Qt_4_5);

    if (_blocksize == 0)
    {
        qDebug("Bytes Available on socket: %d", _lsock->bytesAvailable());
        if (_lsock->bytesAvailable() < sizeof(blocksize_t))
            return;

        in >> _blocksize;
    }

    // We need more data?
    if (_lsock->bytesAvailable() < _blocksize)
        return;

    ReadRequest(in);

    // Reset
    _blocksize = 0; 

}

如果不设置_blocksize为零,我将无法接收更多数据,只能接收第一个块组(我希望整个块在没有分段的情况下到达,因为这是通过管道,但事实并非如此,请看图)。当然,我希望这种行为,因为 _blocksize 不再代表当前的流。好吧,重置 _blocksize 可以解决问题,但是我无法从客户端重新发送另一个数据包,而不会在套接字上获得越来越多的字节数组。我想要的是在 ReadRequest 中处理请求并接收下一个数据块,而无需连接/重新连接所涉及的应用程序。

也许我应该“调节”传入数据的速率?

非常感谢。

4

0 回答 0