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两小时一次的探测包
相关推荐
Yu_iChan4 分钟前
Day03 公共字段填充与菜品管理
java·开发语言
独自破碎E6 分钟前
如何防止接口被恶意刷量?
java·开发语言
期待のcode18 分钟前
Java的单例模式
java·开发语言·单例模式
断春风20 分钟前
从 JDK 8 到 JDK 21:企业级 Java 版本选择的架构思考
java·架构·jdk
h7ml22 分钟前
构建可扩展的企业微信消息推送服务:事件驱动架构在Java中的应用*
java·架构·企业微信
heartbeat..26 分钟前
JavaWeb 核心:HttpServletRequest 请求行、请求头、请求参数完整梳理
java·网络·web·request
Aliex_git26 分钟前
内存堆栈分析笔记
开发语言·javascript·笔记
LYOBOYI12337 分钟前
qml练习:创建地图玩家并且实现人物移动(2)
开发语言·qt
电商API&Tina43 分钟前
【电商API接口】多电商平台数据API接入方案(附带实例)
运维·开发语言·数据库·chrome·爬虫·python·jenkins
叫我莫言鸭1 小时前
关于word生成报告的POI学习2循环标题内容
java·学习·word