linux下的tcp超時機制

今天在linux下用telnet連接另一臺交換機,結果發現,拔掉網線,telnet就僵死在那裏.在windows下,會在10秒後退出telnet````````````經過若干的百度,google後證實,原來linux 內核對於tcp的鏈路檢測這塊,果然存在一個很大的不和諧的地方,就是它默認的情況下,是不會頻發性的去探測鏈路的鏈接狀況,而是要等個默認的keepalive_time,再去發送探測包,如果沒有響應則在keepalive_intval之後再次發送探測包,直到keepalive_count個之後,就關閉該socket!

所以對busybox的networking目錄下的telnet.c進行了代碼的添加

int keepalive = 1; // 開啓keepalive屬性  

int keepidle = 5; // 如該連接在60秒內沒有任何數據往來,則進行探測  

int keepinterval = 5; // 探測時發包的時間間隔爲5 秒  

int keepcount = 2; // 探測嘗試的次數。如果第1次探測包就收到響應了,則後2次的不再發。  

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive ));  

setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle ));  

setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval ));  

setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount ));  

重新編譯,執行,一切oK!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章