質問

私はの行動に少し混乱しています QTcpSocket::waitForBytesWritten()...

この機能はいつブロックされますか?

  • データがTCPを介して送信するためにOSの内部バッファーに書き込まれるまで?
  • データが物理的にTCPパケットに変換されて送信されるまで?
  • データ全体が送信され、リモートクライアントがすべてのパケットが受信されたことを認めるまで?

ドキュメントを見ましたが、それはあまり明確ではなかったようです。

役に立ちましたか?

解決

一般的に言えば、OSは最初の質問に対して簡単なAPIのみを提供します - QTはポータブルAPIであるため、OSのバッファーへの転送を参照してそれに依存することだけが最適です。領収書の実際の承認が必要な場合は、リモートアプリケーションから送信することをお勧めします。結局のところ、データはリモコンでACK'を使用できますが、リモートのOS読み取りバッファーを読み取ることはできません。

リモートサイドブロックを永久にブロックすることを避ける必要がある場合は、代わりに待つ必要があります QIODevice::bytesWritten 信号とイベントループに戻るために他の作業を行うか、単に適切なタイムアウトを設定します。一般に、リモート側はいつでもあるレベルであなたをブロックできます - つまり、ACKを拒否し、ローカルOSバッファーを埋めることができます。どんなレベルでも waitForBytesWritten() ありますが、いつでもブロックできます。

そのような、 bytesWrittenwaitForBytesWritten() データのソースをスロットルするためにのみ使用する必要があります。つまり、1gのデータをソケットに一度に渡すタイトなループに移動する場合、プロセスでバッファリングしてメモリが不足する可能性があります。追加の読み取り/書き込みをトリガーすることにより bytesWritten 信号、この問題を回避できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top