質問

2つのシステムで同じテストコード(サーバー - クライアント)をテストしました。 1つでは、私はSigpipeを手に入れていますが、もう1つはSigpipeを取得していません。

テストシナリオは以下のようなものです。

クライアント

  1. サーバーに接続します
  2. サーバーからデータを受信します
  3. データを送る
  4. ソケットを閉じます

サーバ

  1. サーバーから接続を受け入れます
  2. クライアントにデータを送信します
  3. データを受信します
  4. データを送る
  5. ソケットを閉じます

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().

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