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

背景

你有没有好奇过我们在java中通过Socket.setSoTimeout()设置timeout参数时,他怎么做到在timeout时间到了之后连接就报错的?有没有产生过误解,这个参数就是设置keepalive探测包的检测间隔?

问题真相

其实Socket.setSoTimeout()设置的timeout和keepalive探测包的检测间隔时间完全是两个不一样的参数,在linux中,Socket.setSoTimeout()的实现如下代码所示:

c 复制代码
// 如果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两小时一次的探测包
相关推荐
架构师沉默6 小时前
别又牛逼了!AI 写 Java 代码真的行吗?
java·后端·架构
后端AI实验室11 小时前
我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
java·ai
凉年技术13 小时前
Java 实现企业微信扫码登录
java·企业微信
狂奔小菜鸡14 小时前
Day41 | Java中的锁分类
java·后端·java ee
hooknum14 小时前
学习记录:基于JWT简单实现登录认证功能-demo
java
程序员Terry15 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
NE_STOP15 小时前
MyBatis-缓存与注解式开发
java
码路飞15 小时前
不装 OpenClaw,我用 30 行 Python 搞了个 QQ AI 机器人
java
Re_zero15 小时前
以为用了 try-with-resources 就稳了?这三个底层漏洞让TCP双向通讯直接卡死
java·后端
SimonKing15 小时前
Fiddler抓包完全指南:从安装配置到抓包,一文讲透
java·后端·程序员