まずコードを入力してください:
リーリープログラム全体の流れはおおよそ次のとおりです:
サーバーが起動すると、アクセプターはリスニング状態になり、その後クライアントが接続を要求します。接続が成功すると、サーバーはコールバック newConnection を呼び出して「調子はどうですか?」を送信します。 」をクライアントに送信し、クライアントはそれを受け入れた後に印刷します。
以下はエラーの状況です:
gdb デバッグを使用すると、::write(sockfd, "how are you?n", 13);
就会接收到SIGPIPE
毎回プログラムが終了することがわかりました。
プログラムがシグナル SIGPIPE、Broken Pipe. の理由を確認したところ、無効な (接続または切断されていない) sockfd に書き込んでいるとのことでした。しかし、プログラムがコールバック関数の書き込みまで実行されても、接続は閉じません。 (デバッグ用に、すべてのコードに含まれる close もコメントアウトしました)
また、gdb をデバッグして書き込みするときに、 を使用して現在のシステム占有記述子を確認しましたが、connfd はまだ存在します。 ll /proc/pid/fd
我想大声告诉你2017-05-16 13:20:39
解決しました。理由は、::accept の 3 番目のパラメーターが誤って渡されたことです
私のコードでは、受け入れラッパーは次のとおりです:
リーリー呼び出しコードは
リーリーエラーは、::accpet の 3 番目のパラメーターに、変換された sockaddr のサイズではなく、元の sockaddr_in のサイズを渡す必要があることです。次のように変更されました:
リーリー投稿するman 2 accept
:
addrlen 引数は、値と結果の引数です。呼び出し元は、addr が指す構造体のサイズ (バイト単位) を含むように初期化する必要があります。戻り時には、ピア アドレスの実際のサイズが含まれます。
返事0