Linux网络编程--(6)网络超时检测
来源:互联网 发布:淘宝众筹怎么申请 编辑:程序博客网 时间:2024/05/16 15:55
一,网络超时的原因
在网络通信中,有很多操作会使得进程阻塞,超时检测的必要性就体现了出来
避免进程在没有数据时无限制地阻塞,设定的时间到时,进程从原操作返回继续运行。
二、网络超时的解决办法
(1)设置socket的属性
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函数检测socket是够准备
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)设置定时器timer 捕捉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设置的信号处理函数执行完后会重新执行被中断的操作。
阅读全文
0 0
- Linux网络编程--(6)网络超时检测
- 【Linux网络编程】超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络编程中的超时检测
- 网络超时检测-setsockopt()
- Linux学习(二十五):网络超时检测
- 网络中的超时检测!
- Linux网络编程之TCP编程,select多路复用和超时检测,网络属性设置setsockopt之快速重启(非常经典)
- 网络超时检测-select()函数
- 网络超时检测-alarm()函数
- linux网络编程---心跳检测
- 网络编程中的select实现超时检测和通用API
- 关于游戏服务端架构的整理
- 目标检测算法-特征提取之(一)Haar特征
- Android自定义控件热身——View的坐标位置和大小详解
- JS变量
- 项目activity销毁后重建。
- Linux网络编程--(6)网络超时检测
- 给你N个数求其最小公倍数(hdu 1019 Least Common Multiple)
- JS数组
- 买帽子
- Android URI path 转化
- NodeJS、NPM安装配置步骤(windows版本)
- 1037. 在霍格沃茨找零钱(20)——C语言
- 关于Dalvik虚拟机你需要知道的15个问题
- 关于最大子列和的四种解法