zoukankan      html  css  js  c++  java
  • 使用信号SIGALRM 为 recvfrom 设置超时,防止死等待

     1 #include "apue.h"
     2 static void sig_alarm(int);
     3 void do_cli(int sockfd,FILE* fp,(SA*)pserveraddr,socklen_t servlen)
     4 {    
     5     char sendbuf[maxlen],recvbuf[maxlen];
     6     int n;
     7     while((fgets(sendbuf,maxlen,fp))!=NULL)
     8     {    
     9         singal(SIGALRM,sig_alrm);    //register an signal exec function
    10         sendto(sockfd,sendbuf,strlen(sendbuf),0,pserveraddr,servlen);
    11         alarm(5);
    12         if((n=recvfrom(sockfd,recvbuf,maxlen,0,NULL,NULL))<0)
    13         {
    14             if(errno==EINTR)    //time out
    15             {
    16                 fprintf(stderr,"time out 5 sec!
    ");
    17             }
    18             else{                //recv error
    19                 perror("recv error!
    ");
    20             }
    21         }
    22         else
    23         {
    24             alarm(0);    // turn off alarm . we have successed recv a message;
    25             recvbuf[n]='';
    26             fputs(recvbuf,stdout);
    27         }
    28     }
    29 
    30 }
    31 static void sig_alarm(int signo)
    32 {
    33     return;
    34 }

    如果服务器没有及时的返回我们想要的内容,默认情况下recvfrom会永远阻塞的,直到服务器返回数据,这是对客户端是及其不友好的,所以必须加一个时间超时,如果在规定的时间内还是接收不到服务器传回来的数据,那么就停止阻塞。这是用信号实现的。

    我设置了5秒的信号超时,如果在5秒前接收到了信息,那么就关闭这个信号。否则就当5秒时间到时,自动结束程序。

  • 相关阅读:
    [设计模式]C++实现单例
    JMeter基本使用
    Dev TextEdit限制只输入数字
    sql优化方式
    MySql中的索引
    SQL索引的概念
    mysql sql语句大全
    bandedGridView定位尾行(GridView通用)
    GridView中的下拉框赋值
    使得 XtraEditors.TextEdit 失去焦点(LostFocus)的方法
  • 原文地址:https://www.cnblogs.com/coversky/p/7859755.html
Copyright © 2011-2022 走看看