10

TCP サーバーとクライアントが接続されている場合、クライアントがいつ接続されなくなったかを判断したいと思います。クライアントにメッセージを送信しようとするだけでこれを簡単に実行できると思い、send() が -1 を返すと、ソケットを破棄できます。この実装は Windows で動作しますが、Linux で BSD ソケットを使用してこれを実行しようとすると、サーバー側アプリで send() を呼び出すと、クライアントが接続されなくなるとサーバー アプリがクラッシュします。-1 さえ返さない...プログラムを終了するだけです。

なぜこれが起こっているのか説明してください。前もって感謝します!

4

2 に答える 2

17

これは SIGPIPE シグナルが原因です。参照send(2):

send() 関数は、次の場合に失敗します:
[EPIPE] ソケットが書き込みのためにシャットダウンされているか、ソケットが接続モードであり、接続されていません。後者の場合で、ソケットのタイプが SOCK_STREAM または SOCK_SEQPACKET で、MSG_NOSIGNAL フラグが設定されていない場合、SIGPIPE シグナルが呼び出しスレッドに生成されます。

MSG_NOSIGNALこれは、呼び出しでフラグを使用するか、プログラムの先頭でシグナルをsend()無視することで回避できます。この場合、関数は -1 を返し、 に設定します。SIGPIPEsignal(SIGPIPE, SIG_IGN)send()errnoEPIPE

于 2009-08-25T20:05:36.223 に答える
2

SIGPIPE シグナルを無視する必要があります。ソケットで書き込みエラーが発生した場合、プロセスは SIGPIPE を取得し、そのシグナルのデフォルトの動作はプロセスを強制終了することです。*nix で通常必要なネットワーク コードを書く:

signal(SIGPIPE,SIG_IGN);
于 2009-08-25T20:06:14.490 に答える