网络超时检测的方法
2017-04-05 15:04
363 查看
超时检测的必要性
1、避免进程在没有数据是无限制的阻塞
2、当规定的时间到时,进程从源操作返回继续运行
网络通信中,很多操作会使得进程阻塞,这时我们要设定时间,到时间后强制返回,避免进程在没有数据的情况下无限阻塞
网络超时检测的三种方法:
1、通过setsockopt设置套接字属性SO_RCVTIMEO
struct timeval t = {5, 0}
if (setsockopt(listenfd, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t)) == -1) {
perror("setsockopt");
return -1;
}
memset(&peeraddr, 0, sizeof(peeraddr));
len = sizeof(peeraddr);
if ((connfd = accept(listenfd, (struct sockaddr *)&peeraddr, &len)) == -1) {
printf("errno=%d: %s\n", errno, strerror(errno));
if (errno == EAGAIN) {
printf("timeout\n");
return -1;
}
}
2、设定select函数的一个参数实现超时处理
struct timeval t= {3, 0};
while (1) {
。。。。。。
t.tv_sec = 3;
t.tv_usec = 0;
if ((ret = select(maxfd+1, &rdfs, NULL, NULL, &t)) == -1) {
perror("select");
return -1;
}
。。。。。。
}
3、设定一个定时器捕捉SIGALRM信号做超时控制
struct sigaction act;
sigaction(SIGALRM, NULL, &act); //获取SIGALRM信号的属性
act.sa_handler = handler; // 设置SIGALRM信号的处理函数
sigaction(SIGALRM, &act, NULL); // 设置SIGALRM信号的属性
alarm(3); // 定时器设置3秒钟
while (1) {
if ((connfd = accept(listenfd, (struct sockaddr *)&peeraddr, &len)) == -1) {
if (errno == EINTR) {
printf("timeout\n");
return -1;
}
}
定时器3秒钟内没有数据到来,内核产生SIGALRM信号中断当前操作。我们知道设置信号捕捉函数可以用signal函数或是sigaction函数。但这里只能使用sigaction函数,因为signal设置的信号处理函数执行完后会重新执行被中断的操作
1、避免进程在没有数据是无限制的阻塞
2、当规定的时间到时,进程从源操作返回继续运行
网络通信中,很多操作会使得进程阻塞,这时我们要设定时间,到时间后强制返回,避免进程在没有数据的情况下无限阻塞
网络超时检测的三种方法:
1、通过setsockopt设置套接字属性SO_RCVTIMEO
struct timeval t = {5, 0}
if (setsockopt(listenfd, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t)) == -1) {
perror("setsockopt");
return -1;
}
memset(&peeraddr, 0, sizeof(peeraddr));
len = sizeof(peeraddr);
if ((connfd = accept(listenfd, (struct sockaddr *)&peeraddr, &len)) == -1) {
printf("errno=%d: %s\n", errno, strerror(errno));
if (errno == EAGAIN) {
printf("timeout\n");
return -1;
}
}
2、设定select函数的一个参数实现超时处理
struct timeval t= {3, 0};
while (1) {
。。。。。。
t.tv_sec = 3;
t.tv_usec = 0;
if ((ret = select(maxfd+1, &rdfs, NULL, NULL, &t)) == -1) {
perror("select");
return -1;
}
。。。。。。
}
3、设定一个定时器捕捉SIGALRM信号做超时控制
struct sigaction act;
sigaction(SIGALRM, NULL, &act); //获取SIGALRM信号的属性
act.sa_handler = handler; // 设置SIGALRM信号的处理函数
sigaction(SIGALRM, &act, NULL); // 设置SIGALRM信号的属性
alarm(3); // 定时器设置3秒钟
while (1) {
if ((connfd = accept(listenfd, (struct sockaddr *)&peeraddr, &len)) == -1) {
if (errno == EINTR) {
printf("timeout\n");
return -1;
}
}
定时器3秒钟内没有数据到来,内核产生SIGALRM信号中断当前操作。我们知道设置信号捕捉函数可以用signal函数或是sigaction函数。但这里只能使用sigaction函数,因为signal设置的信号处理函数执行完后会重新执行被中断的操作
相关文章推荐
- 网络超时检测方法
- 网络超时检测的三种方法
- 网络超时检测的三种方法
- linux检测网络故障以及恢复网络的方法
- 网络编程中的超时检测
- 对方网络非正常断开检测方法
- 检测网络是否连接的两种方法(C#)
- 网络***检测初步探测方法
- 网络编程中的超时检测
- 对方网络非正常断开检测方法
- 网络编程资料总结(三)----p2p之NAT类型检测方法
- 网络故障检测方法
- 找不到网络路径”的检测方法及解决方案
- 网络入侵检测初步探测方法
- c#检测网络连接问题我没有看到好的方法(转)
- 网络编程中的超时检测
- 三种网络流量检测方法说明和配置
- “在 TCP 网络上检测出有重复名称”错误的解决方法
- 使用fckEditor 出现"检测到有潜在危险的 Request.Form值"的解决方法! (网络整理)
- 网络故障检测方法