网络编程中的超时检测
来源:互联网 发布:js获取inputtext的值 编辑:程序博客网 时间:2024/04/30 03:03
作者:曾宏安,华清远见嵌入式学院讲师。 我们在网络编程中常见的一种做法是:创建好套接字后以阻塞的方式读写,如果没有数据可读的话,程序会一直等待。事实上,网络状况一直不断变化,很有可能在通讯过程中出现网络连接断开。我们在程序中有必要对这种情况进行检测,从而及时做出响应。下面介绍几种常用的超时检测方法(假设我们要求通过套接字等待数据的最大时间为8秒): 一、 设置套接字接收超时 setsockopt可以设置套接字的属性,其中包括接收超时时间。参考代码如下 二、 多路IO复用select select 函数通常被用来实现多路IO复用,同样可以利用它来实现超时处理。参考代码如下: 三、 设置定时器 这种方法的原理是在从套接字接收数据之前先设置8秒钟的定时器。如果8秒钟内没有数据到来,内核产生的SIGALRM信号会中断当前的读操作。我们知道设置信号捕捉函数可以用signal函数或是sigaction函数。但这里只能使用sigaction函数,因为signal设置的信号处理函数执行完后会重新执行被中断的操作。参考代码如下: void handler(int signo) // 自定义SIGALRM信号处理函数 虽然我们是以套接字的读操作为例,实际上在很多类似的情况中,大家都可以酌情采取上面介绍的方法。巧妙的运用所学知识会让你的程序更加灵活和人性化。 嵌入式及3G相关资源及学习请点击:
struct timeval tv; // 描述时间的结构体变量
……
tv.tv_sec = 8;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
……
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)
{
超时处理
}
……
{
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秒钟的定时器
……
嵌入式开发视频 android开发视频 android培训 3G培训 QT培训 QT开发视频 物联网培训 物联网技术视频 嵌入式学习
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络中的超时检测!
- 网络编程中的select实现超时检测和通用API
- 【Linux网络编程】超时检测
- Linux网络编程--(6)网络超时检测
- 网络超时检测-setsockopt()
- 网络超时检测的方法
- 网络超时检测的三种方法
- 网络超时检测-select()函数
- 网络超时检测-alarm()函数
- 简单的几种网络超时检测
- Linux C编程从初学到精通
- Linux Shell编程从初学到精通
- 【excel技巧】基本技巧三
- Excute query
- Linux常用工具速查实用手册
- 网络编程中的超时检测
- SQL查询效率
- Linux从初学到精通
- 数据漂白介绍
- unix网络编程笔记
- javacv开发环境配置–一切原来可以这么简单
- Linux指令从初学到精通
- Ubuntu Linux从初学到精通
- VxWorks设备驱动开发详解