Java的Socket Timeout和tcp的存活探测包是不是一个东西

编程入门 行业动态 更新时间:2024-10-20 05:45:57

Java的Socket Timeout和tcp的存活探测包是不是一个<a href=https://www.elefans.com/category/jswz/34/1770793.html style=东西"/>

Java的Socket Timeout和tcp的存活探测包是不是一个东西

背景

你有没有好奇过我们在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(fd+1, ...);......
}
......
// 重新设置为阻塞模式
SET_BLOCKING(fd);
这个Socket.timeout超时的实现是通过在linux内核代码中判断的,这些Socket.timeout的内容都和keepAlive探测包没有关系,也就是说不管Socket.timeout和keepAlive探测包(一般是连接空闲两个小时后发出)是独立的,空闲的tcp连接什么时候报错取决于是否配置了Socket.timeout,如果配置了Socket.timeout,那么当达到Socket.timeout之后连接就会报错,否则就只有等待tcp的keepAlive两小时一次的探测包

更多推荐

Java的Socket Timeout和tcp的存活探测包是不是一个东西

本文发布于:2023-12-07 10:32:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1671009.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:东西   Socket   Java   tcp   Timeout

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!