の振る舞いに少し混乱していますQTcpSocket::waitForBytesWritten()
...
この機能はいつまでブロックされますか?
- TCP経由で送信するためにデータがOSの内部バッファに書き込まれるまで?
- データが物理的にTCPパケットに変換されて送信されるまで?
- データ全体が送信され、リモート クライアントがすべてのパケットを受信したことを確認するまで?
ドキュメントを見ましたが、あまり明確ではないようでした。
の振る舞いに少し混乱していますQTcpSocket::waitForBytesWritten()
...
この機能はいつまでブロックされますか?
ドキュメントを見ましたが、あまり明確ではないようでした。
一般的に言えば、OS は最初の質問に対して簡単な API しか提供していません。Qt は移植可能な API であるため、OS のバッファへの転送を参照するだけに頼るのが最善です。実際の受信確認が必要な場合は、リモート アプリケーションから送信することをお勧めします。結局のところ、リモートはデータを確認できますが、リモートの OS 読み取りバッファから読み取ることはできません。
リモート側に永久にブロックされるのを避ける必要がある場合は、代わりにQIODevice::bytesWritten
シグナルを待ってからイベント ループに戻って他の作業を行うか、単に適切なタイムアウトを設定する必要があります。一般に、リモート側は常に何らかのレベルでブロックすることができます。つまり、ACK を拒否してローカル OS バッファーをいっぱいにすることができます。レベルwaitForBytesWritten()
に関係なく、いつでもブロックできます。
そのため、データのソースを調整するためにのみ使用する必要がbytesWritten
ありwaitForBytesWritten()
ます。つまり、1G のデータを一度にソケットに渡すタイトなループに入ると、プロセスでデータをバッファリングして使い果たす可能性があります。メモリの。シグナルで追加の読み取り/書き込みをトリガーbytesWritten
することで、この問題を回避できます。