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两小时一次的探测包
相关推荐
姝孟11 分钟前
C++——类和对象
开发语言·c++
小白学大数据12 分钟前
Snapchat API 访问:Objective-C 实现示例
开发语言·macos·objective-c
gopher951113 分钟前
go语言基础入门(一)
开发语言·golang
masa01018 分钟前
JavaScript--JavaScript基础
开发语言·javascript
极客小张19 分钟前
基于正点原子Linux开发板的智能监控与家电控制系统设计:深度解析Video4Linux和TCP/IP技术栈
linux·运维·c++·物联网·网络协议·tcp/ip·算法
拓端研究室TRL21 分钟前
Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码...
开发语言·python·重构
一只特立独行的猪6111 小时前
Java面试——集合篇
java·开发语言·面试
大得3692 小时前
go注册中心Eureka,注册到线上和线下,都可以访问
开发语言·eureka·golang
讓丄帝愛伱2 小时前
spring boot启动报错:so that it conforms to the canonical names requirements
java·spring boot·后端
weixin_586062022 小时前
Spring Boot 入门指南
java·spring boot·后端