3

QTCPSocketから読み取る次のコードがあります。

QString request;

while(pSocket->waitForReadyRead())
{
    request.append(pSocket->readAll());
}

このコードの問題は、すべての入力を読み取り、最後に30秒間一時停止することです。(これがデフォルトのタイムアウトです。)

長いタイムアウトを回避し、入力の終わりに到達したことを検出する適切な方法は何ですか?(これはスレッド内で同期的に発生することになっているため、シグナルを回避する回答が推奨されます。)

4

2 に答える 2

2

確認する唯一の方法は、期待している正確なバイト数を受け取ったときです。これは通常、データパケットの先頭にデータのサイズを送信することによって行われます。最初にそれを読んでから、すべてを取得するまでループを続けます。別の方法は、データの終わりを示す特定の一連のバイトであるセンチネルを使用することですが、これは通常厄介になります。

于 2010-10-27T04:11:14.503 に答える
0

Content-Lengthを含まないHTTP応答のような状況を扱っていて、データが送信されるともう一方の端が接続を閉じることがわかっている場合は、別の解決策があります。

  1. socket.setReadBufferSizeを使用して、送信される可能性のあるすべてのデータに十分な読み取りバッファーがあることを確認します。
  2. socket.waitForDisconnectedを呼び出して、リモートエンドが接続を閉じるのを待ちます
  3. コンテンツの長さとしてsocket.bytesAvailableを使用します

これが機能するのは、接続を閉じてもQTcpSocket内のバッファリングされたデータが破棄されないためです。

于 2011-09-22T07:09:10.760 に答える