tcp是一種面向連線的協議,連線的建立和斷開需要通過收發相應的分節來實現。某些時候,由於網路的故障或是一方主機的突然崩潰而另一方無法檢測到,以致始終保持著不存在的連線。下面介紹一種方法來檢測這種異常斷開的情況
1) 在tcp協議中提供了keepalive檢測。該選項使能後,在乙個tcp連線上,若指定的一段時間內沒有資料交換,則自動傳送分節等待對方確認。
so_keepalive : 該選項設定是否開啟探測
tcp_keepidle : 開始傳送探測分節前等待的空閒時間
tcp_keepintvl: 兩次傳送探測分節的時間間隔
tcp_keepcnt: 判定斷開前傳送探測分節的次數
2) 設定探測相關選項值
int keepalive = 1;
// 開啟探測
int keepidle = 60;
// 開始探測前的空閒等待時間
int keepintvl = 10;
// 傳送探測分節的時間間隔
int keepcnt = 3;
// 傳送探測分節的次數
3) 設定套接字的屬性
if (setsockopt(sockfd, sol_socket, so_keepalive, (void *)&keepalive, sizeof (keepalive) < 0)
if (setsockopt(sockfd, sol_tcp, tcp_keepidle, (void *) &keepidle, sizeof (keepidle) < 0)
if (setsockopt(sockfd, sol_tcp, tcp_keepintvl, (void *)&keepintvl, sizeof (keepintvl) < 0)
if (setsockopt(sockfd, sol_tcp, tcp_keepcnt, (void *)&keepcnt, sizeof (keepcnt) < 0)
一旦開啟keepalive探測,當tcp連線異常斷開後,對sockfd進行recv操作會返回-1,並且errno的值為etimedout。
這樣一來就可以很方便的在應用程式中檢測tcp連線的情況,如果檢測到異常斷開最簡單的處理就是關閉連線。
TCP連線異常斷開的檢測
華清遠見嵌入式學院 講師。tcp是一種面向連線的協議,連線的建立和斷開需要通過收發相應的分節來實現。某些時候,由於網路的故障或是一方主機的突然崩潰而另一方無法檢測到,以致始終保持著不存在的連線。下面介紹一種方法來檢測這種異常斷開的情況 1 在tcp協議中提供了keepalive檢測。該選項使能後,在...
TCP異常斷開檢測
tcp異常斷開是指在突然斷電,直接拔網線等等情況下,如果通訊雙方沒有進行資料傳送通訊等處理的時候,無法獲知連線已經斷開的情況.在通常的情況下,為了使得socket通訊不受作業系統的限制,需要自己在應用層實現心跳包機制,來檢查異常斷開的情況,一般的方式就是伺服器在一段時間沒有收到客戶端資料報時,定時發...
Tcp 斷開連線
tcp協議規定,對於已經建立的連線,網路雙方要進行四次握手才能成功斷開連線,如果缺少了其中某個步驟,將會使連線處於假死狀態,連線本身占用的資源不會被釋放。網路伺服器程式要同時管理大量連線,所以很有必要保證無用連線完全斷開,否則大量僵死的連線會浪費許多伺服器資源。在眾多tcp狀態中,最值得注意的狀態有...