关于服务端的FIN_WAIT2
服务端开启了TCP服务,客户端连接,正常的情况下当服务端closesocket后向客户端发送FIN,客户端回应ACK,此时服务端进入FIN_WAIT2状态,等待客户端发送FIN然后进入CLOSED。
这时,客户端还可以send一次数据,send完后,服务端收到后就会向客户端发送RST并进入CLOSED
若客户端始终不发送数据,并且也不Close,那么服务端的FIN_WAIT2会持续要一个默认超时(一般是60s),这个种残留链接太多的时候可能会消耗服务端资源,降低性能,甚至无法正常工作。
我们可以使用SO_LINGER来改变关闭连接的行为
struct linger lg;
lg.l_onoff = 1;
lg.l_linger = 0;
setsockopt(sk, SOL_SOCKET, SO_LINGER, (char*)&lg, sizeof(lg));
l_onoff | l_linger | closesocket行为 | 发送队列 | 底层行为 |
l零 | 忽略 | 立即返回。 | 保持直至发送完成。 | 系统接管套接字并保证将数据发送至对端。 |
非零 | 零 | 立即返回。 | 立即放弃。 | 直接发送RST包,自身立即复位,不用经过2MSL状态。对端收到复位错误号。 |
非零 | 非零 | 阻塞直到l_linger时间超时或数据发送完成。(套接字必须设置为阻塞zhuan) | 在超时时间段内保持尝试发送,若超时则立即放弃。 | 超时则同第二种情况,若发送完成则皆大欢喜。 |
另外,除了SO_LINGER的方式,还有一种知其然不知其所以然的方法,这是在调试一个服务程序时发现的,没搞清楚其内部原由:
使用ReadFile对Socket发起一次读取,其中使用到OVERLAPPED数据结构,这里非常关键
OVERLAPPED ov;
ov.hEvent = 0; //必须置零
ov.OffsetHigh=0; //必须置零
DWORD nRead = 0;
char chBuf[100];
BOOL blRet = ReadFile(sk, chBuf, 10,(LPDWORD)(&nRead), &ov);//肯定读不到数据
closesocket(sk); //此时关闭socket,可以直接发送RST,而不经过四次握手
关于服务端的FIN_WAIT2相关推荐
- weblogic请求服务端超时后重发一次请求_记一次后端服务偶发502的排错之旅
现象 最近线上业务反馈,服务不定时的出现502报错.登陆到网关日志平台查询httpcode等于502的,还真的发现同一个服务出现的概率还是蛮高的.所以开始了502的排查之旅. 抓包吧 为了复现问题,直 ...
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享
CORS通信过程,都是浏览器或http插件自动完成,不需要 用户/开发人员 参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码是完全一样的.浏览器一旦发现AJAX请求跨源,就会自动添 ...
- JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性
一.什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间.如何用最简单的方法来搭建 ...
- RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例
1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...
- Go 学习笔记(78)— Go 标准库 net/http 创建服务端(接收 GET、POST 请求)
使用 net/http 标准库创建一个 http 的 restful api 的服务端,用来处理 GET.POST 等请求. 源代码如下: package mainimport ("enco ...
- OpenResty搭建高性能服务端
Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提供的I/O复用方式,自从Linux2.6 ...
- JAVA实现ftp服务端_用 java 实现FTP SERVER(附源码)
前面用 PYTHON 实现了一个 ftp server(参考这里) ,有朋友问有没有java版本的,其实说白了,ftp 也就是 tcp/ip 协议的一个应用而已,而tcp/ip 基本都是通过socke ...
- Java Websocket实例【服务端与客户端实现全双工通讯】
Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...
最新文章
- Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库
- linux 应急响应 病毒清除 系统加固
- linux存储--mmap与sendfile(十七)
- 浪潮linux网卡驱动,浪潮NF5280M5安装redhat7.2下网卡驱动
- 我的一个特点:数据处理能力还可以,但是数据规律记忆能力有限
- yum安装MariaDb10.2国内yum源配置
- B. The Cake Is a Lie
- 漂亮 动态效果 信息提示(jquery版)
- Spring框架 IOC
- Redis 设计与实现
- Python实现Hart协议
- java 四分位算法_Java 四分位算法
- 不同阶段,产品经理需要哪些能力?
- keras求两向量间的余弦值
- 农村姑娘误加了一个博士群,结果...
- 此计算机未连接到网络.单击以连接,此计算机无法连接到家庭组win7
- 自制一个交叉适配器来检修网络设备(转)
- unity微信分享及回调
- 如何批量生成Flattermarken条码
- SVG排版教程 | 样式背景属性详解与应用
热门文章
- initial、inherit、unset、revert和all的区别
- Machine learning K-Means课堂笔记
- 1996届瑞安市计算机学校,1996届校友
- 华为,工资岗位揭秘 2010年08月02日
- mac $php_autoconf,开发者说PHPersay-Mac安装Swoole扩展phpize 时 Cannot find autoconf 解决方法...
- 转载本论坛 (fudan_abc ) :linux那些事儿之我是u盘(16)冰冻三尺非一日之寒
- SpringBoot之静态资源访问配置
- docker启动es报错:failed to obtain node locks...
- 雄关漫道真如铁,而今迈步从头越(嗨翻C语言)8.6
- The Necklace