3

TCP経由でサーバーに接続するアプリに取り組んでいます。

なんらかの理由でソケットが閉じられた場合、SIGPIPE ハンドラーに行き着きます。

recv と send が切断/クローズされたソケットでエラーを返すようにするにはどうすればよいですか?

ありがとう

4

6 に答える 6

3

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)");
}
于 2016-04-26T03:42:38.973 に答える
2

シグナルを無視するには、シグナル ハンドラを無視するように設定しますSIG_IGN

struct sigaction sa;
memset(&sa, 0, sizeof(sa));

sa.sa_handler = SIG_IGN;

if (-1 == sigaction(SIGPIPE, &sa, NULL))
{
  perror("sigaction() failed");
}
于 2013-10-22T06:53:31.080 に答える
2

SIG_IGNそれを処理するのではなく、信号。 send-1 が返され、errno が EPIPE に設定されます。

于 2013-10-22T05:18:14.470 に答える
0

シグナルハンドラを使用するか無視する

#include <signal.h>
signal(SIGPIPE, SIG_IGN);

ソケットへの書き込み中に、最初にソケット fd が正かプログラム内にないかを確認します。外部的に、有効なソケットのポインターを送信していることを確認する必要があります

于 2013-10-22T05:31:46.423 に答える
0

無視できますSIGPIPE

 #include <signal.h>

signal(SIGPIPE, SIG_IGN);

または、シグナルハンドラを使用できます。

signal(SIGPIPE, handler);
void handler(int signal)
{   
    //("Signal caught");

}
于 2013-10-22T06:21:08.810 に答える