1. 程式人生 > >Linux網路程式設計--(6)網路超時檢測

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設定的訊號處理函式執行完後會重新執行被中斷的操作。