検索

ホームページ  >  に質問  >  本文

linux - クライアント/サーバー プログラム エラー プログラムがシグナル SIGPIPE を受信しました。パイプが壊れています。

まずコードを入力してください:

リーリー

プログラム全体の流れはおおよそ次のとおりです:
サーバーが起動すると、アクセプターはリスニング状態になり、その後クライアントが接続を要求します。接続が成功すると、サーバーはコールバック newConnection を呼び出して「調子はどうですか?」を送信します。 」をクライアントに送信し、クライアントはそれを受け入れた後に印刷します。

以下はエラーの状況です:
gdb デバッグを使用すると、::write(sockfd, "how are you?n", 13);就会接收到SIGPIPE 毎回プログラムが終了することがわかりました。

プログラムがシグナル SIGPIPE、Broken Pipe. の理由を確認したところ、無効な (接続または切断されていない) sockfd に書き込んでいるとのことでした。しかし、プログラムがコールバック関数の書き込みまで実行されても、接続は閉じません。 (デバッグ用に、すべてのコードに含まれる close もコメントアウトしました)

また、gdb をデバッグして書き込みするときに、

を使用して現在のシステム占有記述子を確認しましたが、connfd はまだ存在します。 ll /proc/pid/fd

それでは、なぜ SIGPIPE があるのか​​全く理解できません。アドバイスをお願いします。

仅有的幸福仅有的幸福2752日前765

全員に返信(1)返信します

  • 我想大声告诉你

    我想大声告诉你2017-05-16 13:20:39

    解決しました。理由は、::accept の 3 番目のパラメーターが誤って渡されたことです

    私のコードでは、受け入れラッパーは次のとおりです:

    リーリー

    呼び出しコードは

    リーリー

    エラーは、::accpet の 3 番目のパラメーターに、変換された sockaddr のサイズではなく、元の sockaddr_in のサイズを渡す必要があることです。次のように変更されました:

    リーリー

    投稿するman 2 accept:

    addrlen 引数は、値と結果の引数です。呼び出し元は、addr が指す構造体のサイズ (バイト単位) を含むように初期化する必要があります。戻り時には、ピア アドレスの実際のサイズが含まれます。

    返事
    0
  • キャンセル返事