PHP头条
热点:

[C&C++中超时实现] 

一般在Linux C/C++中,可以使用:alarm() 设置定时器的方式实现秒级超时,或者:select()、poll()、epoll() 之类的异步复用IO实现毫秒级超时。也可以使用二次封装的异步io库libevent, libev)也能实现。

一、使用alarm中用信号实现超时 秒级超时)

说明:Linux内核connect超时通常为75秒,我们可以设置更小的时间如10秒来提前从connect中返回。这里用使用信号处理机制,调用alarm,超时后产生SIGALRM信号 也可使用select实现) 

用 alarym 秒级实现 connect 设置超时代码示例:

  1. //信号处理函数   
  2. static void connect_alarm(int signo)  
  3.  
  4. {  
  5.  
  6.      debug_printf("SignalHandler");  
  7.  
  8.      return;  
  9.  
  10. }  
  11.  
  12.    
  13.  
  14. //alarm超时连接实现  
  15.  
  16. static void conn_alarm()  
  17.  
  18. {   
  19.  
  20. Sigfunc * sigfunc ; //现有信号处理函数  
  21.  
  22. sigfunc=signal(SIGALRM, connect_alarm); //建立信号处理函数connect_alarm,(如果有)保存现有的信号处理函数   
  23.  
  24.     int timeout = 5;  
  25.  
  26.    
  27.  
  28.     //设置闹钟  
  29.  
  30. if( alarm(timeout)!=0 ){   
  31.  
  32.   //... 闹钟已经设置处理  
  33.  
  34. }   
  35.  
  36.    
  37.  
  38.     //进行连接操作  
  39.  
  40.     if (connect(m_Socket, (struct sockaddr *)&addr, sizeof(addr)) < 0 ) {  
  41.  
  42.         if ( errno == EINTR ) { //如果错误号设置为EINTR,说明超时中断了  
  43.  
  44.             debug_printf("Timeout");  
  45.  
  46.             m_connectionStatus = STATUS_CLOSED;  
  47.  
  48.             errno = ETIMEDOUT; //防止三次握手继续进行   
  49.  
  50.             return ERR_TIMEOUT;  
  51.  
  52.         }  
  53.  
  54.         else {  
  55.  
  56.             debug_printf("Other Err");  
  57.  
  58.             m_connectionStatus = STATUS_CLOSED;  
  59.  
  60.             return ERR_NET_SOCKET;  
  61.  
  62.         }  
  63.  
  64.     }  
  65.  
  66. alarm(0);//关闭时钟   
  67.  
  68. signal(SIGALRM, sigfunc); //(如果有)恢复原来的信号处理函数   
  69.  
  70. return;   
  71.  
  72. }  

//读取数据的超时设置

同样可以为 recv 设置超时,5秒内收不到任何应答就中断 

  1. signal( ... );   
  2.  
  3. alarm(5);   
  4.  
  5. recv( ... );   
  6.  
  7. alarm(0);   
  8.  
  9. static void sig_alarm(int signo){return;}  

当客户端阻塞于读(readline,...)时,如果此时服务器崩了,客户TCP试图从服务器接收一个ACK,持续重传 数据分节,大约要等9分钟才放弃重传,并返回一个错误。因此,在客户读阻塞时,调用超时。


www.phpzy.comtrue/php/2425.htmlTechArticle[CC++中超时实现] 一般在LinuxC/C++中,可以使用:alarm()设置定时器的方式实现秒级超时,或者:select()、poll()、epoll()之类的异步复用IO实现毫秒级超时。也可...

相关文章

相关频道:

PHP之友评论

今天推荐