網路程式設計中的超時檢測
http://www.embedu.org/Column/Column208.htm
作者:曾巨集安,華清遠見嵌入式學院講師。
我們在網路程式設計中常見的一種做法是:建立好套接字後以阻塞的方式讀寫,如果沒有資料可讀的話,程式會一直等待。事實上,網路狀況一直不斷變化,很有可能在通訊過程中出現網路連線斷開。我們在程式中有必要對這種情況進行檢測,從而及時做出響應。下面介紹幾種常用的超時檢測方法(假設我們要求通過套接字等待資料的最大時間為8秒):
一、 設定套接字接收超時
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訊號處理函式
{
return;
}
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秒鐘的定時器
……
相關文章
- 網路安全中,計算機病毒檢測方法有哪些?計算機
- redis主從超時檢測Redis
- Python中的類超程式設計Python程式設計
- 從設計110序列檢測器來看--同步時序電路設計
- grafana 網路丟包率檢測設定Grafana
- Java中神經網路Triton GPU程式設計Java神經網路GPU程式設計
- 在Linux中,如何使用Suricata進行實時網路威脅檢測?Linux
- 檢測網路狀態
- 網路通訊程式設計程式設計
- 網路協程程式設計程式設計
- Socket 程式設計 (網路篇)程式設計
- py網路工具程式設計程式設計
- 網路程式設計(中)程式設計
- Eth:全球最大的可程式設計分散式超級計算機網路(附下載)程式設計分散式計算機網路
- 程式設計思想之中間層檢測類程式設計
- GOLANG實現超時物件檢測的最好理解的方式Golang物件
- 網路超時控制 + 指數補償法超時連線
- 認識一下JavaScrip中的超程式設計Java程式設計
- linux網路程式設計之socket(十一):套接字I/O超時設定方法和用select實現超時Linux程式設計
- JS 檢測網路頻寬JS
- 檢測網路狀態 - flutterFlutter
- iOS 檢測網路狀態iOS
- 超載的程式設計師程式設計師
- Python網路Socket程式設計Python程式設計
- TCPView(檢視網路埠的程式)TCPView
- 網路程式設計必備:Python中Paramiko和FTP的資料夾與檔案檢測技巧程式設計PythonFTP
- 深度學習技術在網路入侵檢測中的應用深度學習
- HttpClient設定聯網超時時間HTTPclient
- 網路程式設計在自動化測試中的實踐(十五)程式設計
- python 網路篇(網路程式設計)Python程式設計
- 幾個超火的程式設計網站,別錯過!程式設計網站
- C++ 之Socket 程式設計 send rev 阻塞設定 阻塞超時時間C++程式設計
- 網路狀態檢測的利器 - ss命令
- 網路斷線檢測中用到的popen
- Java中的超程式設計與動態代理技術Java程式設計
- 天才模擬器程式設計師死於網路暴力中程式設計師
- 趣圖:“大學時學習中的程式設計”與“實際工作專案中的程式設計”程式設計
- 程式設計師超實用工具網站大全程式設計師網站