TCP 接続の送信バッファが完全に空かどうかを確認する方法はありますか? 今まで何も見つかりませんでしたが、特定のクライアントにまだデータが送信されている間、サーバーによって接続が閉じられていないことを確認したいだけです。
poll を使用して、ノンブロッキング ソケットでデータを送信できるかどうかを確認しています。しかし、それでは、すべてがバッファに送信されたかどうかを確認できませんよね?
Linux では、ソケットの送信キューを照会できますioctl(sd, SIOCOUTQ, &bytes)
。詳細man ioctl
については、を参照してください。
ACK を受信するまでバッファを空にすることができないため、データがリモート ホストによって受信された可能性があるという意味で、この情報は完全に信頼できるものではありません。TCP の上に別のレベルのフロー制御を追加するために使用しないでください。
リモート ホストが実際に接続を閉じる (または半分閉じる) と、バッファ内のデータ量に関係なく、ソケットは書き込み不能になります。この状態は、ソケットに 0 バイトを書き込むことで検出できます。
より困難な (そして多くの場合、可能性が高い) 状況は、ネットワークの問題またはクラッシュのために、リモート ホストが到達不能になることです。その場合、データは送信バッファーに蓄積されますが、これはリモート ホストの受信バッファーがいっぱいであるために発生する可能性もあります (おそらく、バッファーを読み取るプロセスが入力を処理するのに十分なリソースを持っていないためです)。ネットワーク ルーティングの問題が発生した場合、ルーター通知 (ICMP エラー) が発生し、ソケットが書き込み不能になることがあります。残念ながら、ブラック ホールの原因となるネットワーク エラーが多数あります。