摘要:我們?cè)诰W(wǎng)絡(luò)編程中常見(jiàn)的一種做法是:創(chuàng)建好套接字后以阻塞的方式讀寫(xiě),如果沒(méi)有數(shù)據(jù)可讀的話,程序會(huì)一直等待。事實(shí)上,網(wǎng)絡(luò)狀況一直不斷變化,很有可能在通訊過(guò)程中出現(xiàn)網(wǎng)絡(luò)連接斷開(kāi)。我們?cè)诔绦蛑杏斜匾獙?duì)這種情況進(jìn)行檢測(cè),從而及時(shí)做出響應(yīng)。下面介紹幾種常用的超時(shí)檢測(cè)方法(假設(shè)我們要求通過(guò)套接字等待數(shù)據(jù)的最大時(shí)間為8秒):
我們?cè)诰W(wǎng)絡(luò)編程中常見(jiàn)的一種做法是:創(chuàng)建好套接字后以阻塞的方式讀寫(xiě),如果沒(méi)有數(shù)據(jù)可讀的話,程序會(huì)一直等待。事實(shí)上,網(wǎng)絡(luò)狀況一直不斷變化,很有可能在通訊過(guò)程中出現(xiàn)網(wǎng)絡(luò)連接斷開(kāi)。我們?cè)诔绦蛑杏斜匾獙?duì)這種情況進(jìn)行檢測(cè),從而及時(shí)做出響應(yīng)。下面介紹幾種常用的超時(shí)檢測(cè)方法(假設(shè)我們要求通過(guò)套接字等待數(shù)據(jù)的最大時(shí)間為8秒):
一、 設(shè)置套接字接收超時(shí)
setsockopt可以設(shè)置套接字的屬性,其中包括接收超時(shí)時(shí)間。參考代碼如下
struct timeval tv; // 描述時(shí)間的結(jié)構(gòu)體變量
……
tv.tv_sec = 8;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
……
二、 多路IO復(fù)用SELECT
SELECT 函數(shù)通常被用來(lái)實(shí)現(xiàn)多路IO復(fù)用,同樣可以利用它來(lái)實(shí)現(xiàn)超時(shí)處理。參考代碼如下:
struct timeval tv; // 描述時(shí)間的結(jié)構(gòu)體變量
fdset rdfds; // 定義讀描述符集合
……
tv.tv_sec = 8;
tv.tv_usec = 0;
FD_ZERO(&rdfds);
FD_SET(sockfd, &rdfds);
[1] [2]
通信工程師備考資料免費(fèi)領(lǐng)取
去領(lǐng)取
共收錄117.93萬(wàn)道題
已有25.02萬(wàn)小伙伴參與做題