1. ホーム
  2. c

[解決済み] Broken Pipe Errorの原因は何ですか?

2022-03-01 21:53:49

質問

相手側のソケットを閉じたときにパイプ切れエラーが発生するのは知っています。

しかし、私のテストでは、相手側が閉じているときにこちら側ですぐに「送信」を呼び出すと、必ずしもパイプ破損エラーになるとは限らないことに気づきました。

例えば

ピア側でソケットを閉じた後(closeを呼んできれいに閉じたり、ピアを殺して異常終了したりしました)、40バイトを送信しようとすると、パイプは壊れませんが、40000バイトを送信しようとすると、すぐにパイプ切れエラーが発生します。

パイプ破損の原因は何でしょうか、またその挙動を予測することは可能でしょうか?

解決方法は?

ネットワーククローズが観測されるまでには時間がかかることがあります。ポート宛てのパケットがすべて死んだとみなされるまでの合計時間は、クローズ後、公称約2分(そう、分です!)です。 エラー状態は、ある時点で検出されます。 小さな書き込みでは、システムのMTUの内側なので、メッセージは送信のためにキューに入れられます。 大きな書き込みの場合は、MTUより大きいので、システムは問題をより早く発見します。 SIGPIPEシグナルを無視した場合、関数は壊れたパイプでEPIPEエラーを返します - 接続が壊れていることが検出された時点で、です。