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两小时一次的探测包
相关推荐
qq_406176147 分钟前
深入理解 JavaScript 闭包:从原理到实战避坑
开发语言·前端·javascript
Knight_AL10 分钟前
设计模式之责任链模式:原理解析 + Java 示例
java·设计模式·责任链模式
float_六七12 分钟前
JavaScript变量声明:var的奥秘
开发语言·前端·javascript
1candobetter12 分钟前
JAVA后端开发——深入理解 Java Static
java·开发语言
一念一花一世界20 分钟前
PostIn项目实战 - 使用Mock数据尽早满足前后端接口开发需求
java·mock·postin·接口管理工具
FuckPatience20 分钟前
C# SqlSugar+SQLite: 无法加载 DLL“e_sqlite3”: 找不到指定的模块
开发语言·c#
清水白石00820 分钟前
深入理解 Python 字典的有序性:从 3.6 的“意外之喜”到 3.7 的官方承诺
开发语言·python
白露与泡影21 分钟前
Spring事件机制完全指南:解耦利器与实战
java·后端·spring
DYS_房东的猫23 分钟前
《 C++ 零基础入门教程》第10章:C++20 核心特性 —— 编写更现代、更优雅的 C++
java·c++·c++20
好好沉淀23 分钟前
Spring AI Alibaba
java·人工智能·spring