linux - クライアント/サーバー プログラム エラー プログラムがシグナル SIGPIPE を受信しました。パイプが壊れています。
仅有的幸福
仅有的幸福 2017-05-16 13:18:39
0
1
770

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

リーリー

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

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

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

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

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

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

仅有的幸福
仅有的幸福

全員に返信(1)
我想大声告诉你

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

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

リーリー

呼び出しコードは

リーリー

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

リーリー

投稿するman 2 accept:

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート