Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137285
  • 博文数量: 35
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-09 12:22
个人简介

http://www.76ku.cn

文章分类

全部博文(35)

文章存档

2011年(1)

2010年(17)

2007年(17)

我的朋友

分类: C/C++

2010-04-14 15:30:22

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分钟才放弃重传,并返回一个错误。因此,在客户读阻塞时,调用超时。
阅读(2730) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~