質問
2つのシステムで同じテストコード(サーバー - クライアント)をテストしました。 1つでは、私はSigpipeを手に入れていますが、もう1つはSigpipeを取得していません。
テストシナリオは以下のようなものです。
クライアント
- サーバーに接続します
- サーバーからデータを受信します
- データを送る
- ソケットを閉じます
サーバ
- サーバーから接続を受け入れます
- クライアントにデータを送信します
- データを受信します
- データを送る
- ソケットを閉じます
1つのシステム(同じシステムで実行されているクライアントとサーバー)では、Sigpipeはクライアントまたはサーバー側でランダムに発生しています。
しかし、別のシステムでは、この問題は同じテストコードでは発生していません。
壊れたパイプにはTCP設定と関係があるのだろうか。
解決
また、このコードによるアプリケーションのクラッシュを防ぐために、ソケットからのSigpipeを無視することもできます。
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
ここで、SDはSigpipesを受け取るソケットです。
他のヒント
SIGPIPE
もう一方の端がすでに閉じているソケットに書き込もうとすると、信号が上がります。ここには、一方の端がデータを送信しようとするのとほぼ同じ時期にソケットを閉じる場合、condedの通知が送信の前または後に受信される可能性があります。 SIGPIPE
1つのテスト環境で発生しており、もう1つのテスト環境ではありません。
一般に、ソケットが認識しているアプリケーションは無視する必要があります SIGPIPE
, 、代わりに結果を同期して処理します EPIPE
からのエラー send()
.
所属していません StackOverflow