服务端开启了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相关推荐

  1. weblogic请求服务端超时后重发一次请求_记一次后端服务偶发502的排错之旅

    现象 最近线上业务反馈,服务不定时的出现502报错.登陆到网关日志平台查询httpcode等于502的,还真的发现同一个服务出现的概率还是蛮高的.所以开始了502的排查之旅. 抓包吧 为了复现问题,直 ...

  2. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  3. kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享

    CORS通信过程,都是浏览器或http插件自动完成,不需要 用户/开发人员 参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码是完全一样的.浏览器一旦发现AJAX请求跨源,就会自动添 ...

  4. JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

    一.什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间.如何用最简单的方法来搭建 ...

  5. RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例

    1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...

  6. Go 学习笔记(78)— Go 标准库 net/http 创建服务端(接收 GET、POST 请求)

    使用 net/http 标准库创建一个 http 的 restful api 的服务端,用来处理 GET.POST 等请求. 源代码如下: package mainimport ("enco ...

  7. OpenResty搭建高性能服务端

    Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提供的I/O复用方式,自从Linux2.6 ...

  8. JAVA实现ftp服务端_用 java 实现FTP SERVER(附源码)

    前面用 PYTHON 实现了一个 ftp server(参考这里) ,有朋友问有没有java版本的,其实说白了,ftp 也就是 tcp/ip 协议的一个应用而已,而tcp/ip 基本都是通过socke ...

  9. Java Websocket实例【服务端与客户端实现全双工通讯】

    Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...

最新文章

  1. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库
  2. linux 应急响应 病毒清除 系统加固
  3. linux存储--mmap与sendfile(十七)
  4. 浪潮linux网卡驱动,浪潮NF5280M5安装redhat7.2下网卡驱动
  5. 我的一个特点:数据处理能力还可以,但是数据规律记忆能力有限
  6. yum安装MariaDb10.2国内yum源配置
  7. B. The Cake Is a Lie
  8. 漂亮 动态效果 信息提示(jquery版)
  9. Spring框架 IOC
  10. Redis 设计与实现
  11. Python实现Hart协议
  12. java 四分位算法_Java 四分位算法
  13. 不同阶段,产品经理需要哪些能力?
  14. keras求两向量间的余弦值
  15. 农村姑娘误加了一个博士群,结果...
  16. 此计算机未连接到网络.单击以连接,此计算机无法连接到家庭组win7
  17. 自制一个交叉适配器来检修网络设备(转)
  18. unity微信分享及回调
  19. 如何批量生成Flattermarken条码
  20. SVG排版教程 | 样式背景属性详解与应用

热门文章

  1. initial、inherit、unset、revert和all的区别
  2. Machine learning K-Means课堂笔记
  3. 1996届瑞安市计算机学校,1996届校友
  4. 华为,工资岗位揭秘 2010年08月02日
  5. mac $php_autoconf,开发者说PHPersay-Mac安装Swoole扩展phpize 时 Cannot find autoconf 解决方法...
  6. 转载本论坛 (fudan_abc ) :linux那些事儿之我是u盘(16)冰冻三尺非一日之寒
  7. SpringBoot之静态资源访问配置
  8. docker启动es报错:failed to obtain node locks...
  9. 雄关漫道真如铁,而今迈步从头越(嗨翻C语言)8.6
  10. The Necklace