Linux網路程式設計--(6)網路超時檢測
阿新 • • 發佈:2019-02-13
一,網路超時的原因
在網路通訊中,有很多操作會使得程序阻塞,超時檢測的必要性就體現了出來
避免程序在沒有資料時無限制地阻塞,設定的時間到時,程序從原操作返回繼續執行。二、網路超時的解決辦法
(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));(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");(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設定的訊號處理函式執行完後會重新執行被中斷的操作。