我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1035|回复: 0

网络编程中的超时检测-ARM

[复制链接]

该用户从未签到

1万

主题

1292

回帖

936

积分

管理员

积分
936

社区居民最爱沙发原创达人社区明星终身成就奖优秀斑竹奖宣传大使奖特殊贡献奖

QQ
发表于 2013-7-30 19:13:48 | 显示全部楼层 |阅读模式
我们在网络编程中常见的一种做法是:创建好套接字后以阻塞的方式读写,如果没有数据可读的话,程序会一直等待。事实上,网络状况一直不断变化,很有可能在通讯过程中出现网络连接断开。我们在程序中有必要对这种情况进行检测,从而及时做出响应。下面介绍几种常用的超时检测方法(假设我们要求通过套接字等待数据的最大时间为8秒):一、 设置套接字接收超时setsockopt可以设置套接字的属性,其中包括接收超时时间。参考代码如下struct timeval tv; // 描述时间的结构体变量……tv.tv_sec = 8;tv.tv_usec = 0;setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));……二、 多路IO复用selectselect 函数通常被用来实现多路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秒钟的定时器……虽然我们是以套接字的读操作为例,实际上在很多类似的情况中,大家都可以酌情采取上面介绍的方法。巧妙的运用所学知识会让你的程序更加灵活和人性化。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表