send()问题

时间:2011-04-12 20:33:14

标签: c networking

当我使用网络浏览器测试我的程序时,我可以写入套接字/ FD就好了,所以我决定循环它并切断连接中间连接,我注意到了一个问题。当套接字不可用时,send()能够关闭整个程序。我认为问题在于该程序陷入了陷阱22并自行关闭。所以我设置套接字不阻止。没变。有关为什么会发生这种情况的任何想法?

else if ( b->temp_socket_list[read].revents & POLLOUT ) {  
    printf ( "#Write#\n" );  
    char *done = "Done!";  
    int sent = send ( sock, done, 5, 0 );  
    printf ( "end\n", sent );  
}  

4 个答案:

答案 0 :(得分:5)

这可能是由SIGPIPE信号的默认操作引起的。要忽略此信号,请使用以下内容:

signal(SIGPIPE, SIG_IGN);

然后,套接字错误将被报告为套接字函数的返回值,而不是信号。

答案 1 :(得分:3)

作为忽略SIGPIPE的替代方法,this post在如何避免它们方面有一些很好的答案。

答案 2 :(得分:3)

这是哪个平台?

在UNIX上,在某些情况下,你可以在连接断开时获得一个信号(SIGPIPE)并且这默认终止程序......解决方案是为SIGPIPE安装一个什么都不做的信号处理程序。

答案 3 :(得分:0)

试试这个:

sigset_t set, oldset;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, &oldset);
/* use send all you like here */
sigtimedwait(&set, 0, (struct timespec [1]){0});
pthread_sigmask(SIG_SETMASK, &oldset, 0);

我不是100%确定它有效,但我相信它应该,如果它是正确的那么它是一个可以从库代码中使用的解决方案,而不会弄乱调用者或其他潜在信号使用线程的状态

另请注意,如果程序(或者甚至只是当前线程)不想使用SIGPIPE,您可以通过永久阻止SIGPIPE来简化此操作:

sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, &oldset);