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