我正在开发一个通过TCP连接到服务器的应用程序。
如果套接字由于某种原因被关闭,我最终会进入SIGPIPE处理程序。
我该怎么做才能使recv和send只在断开/关闭的套接字上返回错误?
由于
答案 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");
}