網路程式設計中的超時檢測

2021-05-22 00:22:34 字數 1165 閱讀 7533

華清遠見嵌入式學院

講師。一、 設定套接字接收超時

setsockopt可以設定套接字的屬性,其中包括接收超時時間。參考**如下

struct timeval tv; // 描述時間的結構體變數

……tv.tv_sec = 8;

tv.tv_usec = 0;

setsockopt(sockfd, sol_socket, so_rcvtimeo, &tv, sizeof(tv));

……二、 多路io復用select

select 函式通常被用來實現多路io復用,同樣可以利用它來實現超時處理。參考**如下:

struct timeval tv; // 描述時間的結構體變數

fdset rdfds; // 定義讀描述符集合

……tv.tv_sec = 8;

tv.tv_usec = 0;

fd_zero(&rdfds);

fd_set(sockfd, &rdfds);

if (select(sockfd+1, &rdfds, null, null, &tv) == 0)

……三、 設定定時器

這種方法的原理是在從套接字接收資料之前先設定8秒鐘的定時器。如果8秒鐘內沒有資料到來,核心產生的sigalrm訊號會中斷當前的讀操作。我們知道設定訊號捕捉函式可以用signal函式或是sigaction函式。但這裡只能使用sigaction函式,因為signal設定的訊號處理函式執行完後會重新執行被中斷的操作。參考**如下:

void handler(int signo) // 自定義sigalrm訊號處理函式

struct sigaction act; // 描述訊號行為的變數

……sigaction(sigalrm, null, &act); // 獲取sigalrm訊號的屬性

act.sa_handler = handler; // 設定sigalrm訊號的處理函式

act.sa_flags &= ~sa_restart; // 關閉重啟被中斷操作的選項

sigaction(sigalrm, &act, null); // 設定sigalrm訊號的屬性

alarm(8); // 設定8秒鐘的定時器

……雖然我們是以套接字的讀操作為例,實際上在很多類似的情況中,大家都可以酌情採取上面介紹的方法。巧妙的運用所學知識會讓你的程式更加靈活和人性化。

網路程式設計中的超時檢測

華清遠見嵌入式學院 講師。一 設定套接字接收超時 setsockopt可以設定套接字的屬性,其中包括接收超時時間。參考 如下 struct timeval tv 描述時間的結構體變數 tv.tv sec 8 tv.tv usec 0 setsockopt sockfd,sol socket,so r...

網路程式設計中的超時檢測

一 設定套接字接收超時 setsockopt可以設定套接字的屬性,其中包括接收超時時間。參考 如下 struct timeval tv 描述時間的結構體變數 tv.tv sec 8 tv.tv usec 0 setsockopt sockfd,sol socket,so rcvtimeo,tv,si...

網路程式設計中的超時檢測

一 設定套接字接收超時 setsockopt可以設定套接字的屬性,其中包括接收超時時間。參考 如下 struct timeval tv 描述時間的結構體變數 tv.tv sec 8 tv.tv usec 0 setsockopt sockfd,sol socket,so rcvtimeo,tv,si...