ローカルサーバーとクライアントアプリケーション間で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でリクエストを処理し、関連するアプリケーションの接続/再接続に頼ることなく、次のデータブロックを受信することです。
たぶん私は着信データのレートを「調整」する必要がありますか?
どうもありがとうございます。