SIGPIPE(OSX)和断开连接的套接字?

时间:2013-10-22 05:02:29

标签: c xcode macos sockets sigpipe

我正在开发一个通过TCP连接到服务器的应用程序。

如果套接字由于某种原因被关闭,我最终会进入SIGPIPE处理程序。

我该怎么做才能使recv和send只在断开/关闭的套接字上返回错误?

由于

5 个答案:

答案 0 :(得分: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)");
}

答案 1 :(得分:2)

SIG_IGN信号而不是处理它。 send将返回-1,而errno将设置为EPIPE。

答案 2 :(得分: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");
}

答案 3 :(得分:0)

使用信号处理程序或忽略它

#include <signal.h>
signal(SIGPIPE, SIG_IGN);
写入套接字时,首先检查套接字fd在程序中是否为正。在外部,您应该检查是否正在发送有效套接字的指针

答案 4 :(得分:0)

您可以忽略SIGPIPE

 #include <signal.h>

signal(SIGPIPE, SIG_IGN);

或者您可以使用信号处理程序。

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

}