今天在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!