Linux网络编程--(6)网络超时检测

一,网络超时的原因

在网络通信中,有很多操作会使得进程阻塞,超时检测的必要性就体现了出来

避免进程在没有数据时无限制地阻塞,设定的时间到时,进程从原操作返回继续运行。

二、网络超时的解决办法

(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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值