登录   |   注册
    准考证打印   论文投票   报考指南   论文辅导   软考培训   郑重申明  
您现在的位置:  首页 > 通信学苑 > 中级互联网技术 >> 正文
正文
网络编程中的超时检测详细过程说明
来源:尚大教育-通信学院 作者:辉辉 时间;2012-12-26 点击数: 尚大软考交流群:376154208
我们在网络编程中常见的一种做法是:创建好套接字后以阻塞的方式读写,如果没有数据可读的话,程序会一直等待。事实上,网络状况一直不断变化,很有可能在通讯过程中出现网络连接断开。

  我们在网络编程中常见的一种做法是:创建好套接字后以阻塞的方式读写,如果没有数据可读的话,程序会一直等待。事实上,网络状况一直不断变化,很有可能在通讯过程中出现网络连接断开。我们在程序中有必要对这种情况进行检测,从而及时做出响应。下面介绍几种常用的超时检测方法(假设我们要求通过套接字等待数据的最大时间为8秒):

    一、 设置套接字接收超时

    setsockopt可以设置套接字的属性,其中包括接收超时时间。参考代码如下

    struct timeval tv; // 描述时间的结构体变量

    ……

    tv.tv_sec = 8;

    tv.tv_usec = 0;

    setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

    ……

    二、 多路IO复用SELECT

    SELECT 函数通常被用来实现多路IO复用,同样可以利用它来实现超时处理。参考代码如下:

    struct timeval tv; // 描述时间的结构体变量

    fdset rdfds; // 定义读描述符集合

    ……

    tv.tv_sec = 8;

    tv.tv_usec = 0;

    FD_ZERO(&rdfds);

    FD_SET(sockfd, &rdfds);

if (SELECT(sockfd+1, &rdfds, NULL, NULL, &tv) == 0)

    {

    超时处理

    }

    ……

    三、 设置定时器

    这种方法的原理是在从套接字接收数据之前先设置8秒钟的定时器。如果8秒钟内没有数据到来,内核产生的SIGALRM信号会中断当前的读操作。我们知道设置信号捕捉函数可以用signal函数或是sigaction函数。但这里只能使用sigaction函数,因为signal设置的信号处理函数执行完后会重新执行被中断的操作。参考代码如下:

    void handler(int signo) // 自定义SIGALRM信号处理函数

    {

    return;

    }

    struct sigaction act; // 描述信号行为的变量

    ……

    sigaction(SIGALRM, NULL, &act); // 获取SIGALRM信号的属性

    act.sa_handler = handler; // 设置SIGALRM信号的处理函数

    act.sa_flags &= ~SA_RESTART; // 关闭重启被中断操作的选项

    sigaction(SIGALRM, &act, NULL); // 设置SIGALRM信号的属性

    alarm(8); // 设置8秒钟的定时器

    ……

    虽然我们是以套接字的读操作为例,实际上在很多类似的情况中,大家都可以酌情采取上面介绍的方法。巧妙的运用所学知识会让你的程序更加灵活和人性化。

来顶一下
返回首页
返回首页
上一篇:网络高效安全数据传输方法设计过程
下一篇:讲诉移动互联网过程的详细过程说明
 相关文章
 
 
跟贴共
笔 名 :   验证码:
网友评论仅供其表达个人看法,并不表明尚大教育同意其观点或证实其描述
距离2023年10月14日通信考试还有
通信各地考务机构
各省市通信报名简章