1

ローカルサーバーとクライアントアプリケーション間でIPCを使用するアプリケーションを開発しています。Qtのドキュメントや例のように構成されているため、特に特別なことはありません。

問題は、クライアントがパケットを頻繁に送信し、サーバーのローカルソケット(NTではパイプと呼ばれる)からの接続/切断が非常に遅いことです。したがって、私が達成しようとしているのは、2つのアプリケーション間の「永続的な」接続です。

クライアントアプリケーションは、問題なくローカルサーバー(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