Chinaunix首页 | 论坛 | 博客
  • 博客访问: 364720
  • 博文数量: 105
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 826
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-16 13:58
个人简介

记录有意义的东西

文章分类

全部博文(105)

文章存档

2013年(105)

我的朋友

分类: 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分钟才放弃重传,并返回一个错误。因此,在客户读阻塞时,调用超时。


阅读(1389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~