辽宁网站推广的目的,教育行业建设网站,网站建设专家cms,户外网站建设背景
你有没有好奇过我们在java中通过Socket.setSoTimeout()设置timeout参数时#xff0c;他怎么做到在timeout时间到了之后连接就报错的#xff1f;有没有产生过误解#xff0c;这个参数就是设置keepalive探测包的检测间隔#xff1f;
问题真相
其实Socket.setSoTimeou…背景
你有没有好奇过我们在java中通过Socket.setSoTimeout()设置timeout参数时他怎么做到在timeout时间到了之后连接就报错的有没有产生过误解这个参数就是设置keepalive探测包的检测间隔
问题真相
其实Socket.setSoTimeout()设置的timeout和keepalive探测包的检测间隔时间完全是两个不一样的参数在linux中Socket.setSoTimeout()的实现如下代码所示
// 如果timeout 0 则设置为nonblock模式
SET_NONBLOCKING(fd);
/*如果有数据,直接获取,否则返回,不阻塞*/
read(fd, ...);
/** 使用系统调用select来模拟阻塞调用超时*/
while (1) {struct timeval t;t.tv_sec timeout / 1000;t.tv_usec (timeout % 1000) * 1000;Select(fd1, ...);......
}
......
// 重新设置为阻塞模式
SET_BLOCKING(fd);这个Socket.timeout超时的实现是通过在linux内核代码中判断的这些Socket.timeout的内容都和keepAlive探测包没有关系也就是说不管Socket.timeout和keepAlive探测包(一般是连接空闲两个小时后发出)是独立的空闲的tcp连接什么时候报错取决于是否配置了Socket.timeout如果配置了Socket.timeout那么当达到Socket.timeout之后连接就会报错否则就只有等待tcp的keepAlive两小时一次的探测包