分类: LINUX
2013-05-11 01:52:22
方法一(使用alarm定时):
connect 设置超时
内核connect超时通常为75秒,我们可以设置更小的时间如10秒来提前从connect中返回
这里用使用信号处理机制,调用alarm,超时后产生SIGALRM信号 (也可使用select实现)
Sigfunc * sigfunc ;
sigfunc=signal(SIGALRM, connect_alarm); //建立信号处理函数connect_alarm,(如果有)保存现有的信号处理函数
if(alarm(10)!=0){
..... // alarm was already set
}
if(connect( ... )<0){
close(fd);
if(errno==EINTR) errno=ETIMEDOUT; //防止三次握手继续进行
}
alarm(0);//关闭时钟
signal(SIGALRM, sigfunc); //(如果有)恢复原来的信号处理函数
return;
}
//信号处理函数
static void connect_alarm(int signo){
return; // 只是返回
}
//=========================
同样可以为 recv 设置超时,5秒内收不到任何应答就中断
signal( ... );
alarm(5);
recv( ... );
alarm(0);
static void sig_alarm(int signo){return;}
当客户端阻塞于读(readline,...)时,如果此时服务器崩了,客户TCP试图从服务器接收一个ACK,持续重传 数据分节,大约要等9分钟才放弃重传,并返回一个错误。因此,在客户读阻塞时,调用超时。