1

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

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

クライアント

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

サーバ

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

1つのシステム(同じシステムで実行されているクライアントとサーバー)では、SIGPIPEはクライアント側またはサーバー側でランダムに発生しています。

ただし、別のシステムでは、この問題は同じテストコードでは発生していません。

壊れたパイプはTCP設定と関係があるのだろうか。

4

2 に答える 2

1

もうSIGPIPE一方の端がすでに閉じているソケットに書き込もうとすると、シグナルが発生します。ここには競合状態があり、一方の端がデータの送信を試みるのとほぼ同時にソケットを閉じると、送信の前後にクローズ通知が受信される可能性があります。これがSIGPIPE、1つのテスト環境で発生しているのではなくもう1つ。

一般に、ソケット対応アプリケーションはを無視し、代わりにから生じるエラーをSIGPIPE同期的に処理する必要があります。EPIPEsend()

于 2011-01-20T06:47:18.853 に答える
1

このコードによるアプリケーションのクラッシュを防ぐために、ソケットからのSIGPIPEを無視することもできます。

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

ここで、sdは、SIGPIPEを受信するソケットです。

于 2011-01-20T06:57:16.263 に答える