TCP経由でサーバーに接続するアプリに取り組んでいます。
なんらかの理由でソケットが閉じられた場合、SIGPIPE ハンドラーに行き着きます。
recv と send が切断/クローズされたソケットでエラーを返すようにするにはどうすればよいですか?
ありがとう
OS X では SIGPIPE を無視しても効果がないことがわかりました。代わりに SO_NOSIGPIPE を使用してください。send() への各呼び出しで要求される MSG_NOSIGNAL とは対照的に、これはソケットで一度設定されることに注意してください。
int socket = accept (...); /* (or however you're getting the socket) */
int option_value = 1; /* Set NOSIGPIPE to ON */
if (setsockopt (socket, SOL_SOCKET, SO_NOSIGPIPE, &option_value, sizeof (option_value)) < 0) {
perror ("setsockopt(,,SO_NOSIGPIPE)");
}
シグナルを無視するには、シグナル ハンドラを無視するように設定しますSIG_IGN
。
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
if (-1 == sigaction(SIGPIPE, &sa, NULL))
{
perror("sigaction() failed");
}
SIG_IGN
それを処理するのではなく、信号。 send
-1 が返され、errno が EPIPE に設定されます。
シグナルハンドラを使用するか無視する
#include <signal.h>
signal(SIGPIPE, SIG_IGN);
ソケットへの書き込み中に、最初にソケット fd が正かプログラム内にないかを確認します。外部的に、有効なソケットのポインターを送信していることを確認する必要があります
無視できますSIGPIPE
#include <signal.h>
signal(SIGPIPE, SIG_IGN);
または、シグナルハンドラを使用できます。
signal(SIGPIPE, handler);
void handler(int signal)
{
//("Signal caught");
}