You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#应用关闭时Socket被销毁:如何保留监听Socket

问题分析与解决方案

首先明确:你看到的FIN_WAIT2状态属于客户端与现金装填机建立的会话Socket,而非现金装填机的监听Socket。监听Socket负责持续接受新连接,不会因单个会话关闭而销毁。出现该问题的核心是TCP连接关闭的时序,以及可能你的C#客户端或现金装填机的Socket配置存在疏漏。

解决步骤:

1. 确认现金装填机的监听Socket状态

执行netstat -ano | findstr ":8092",查看是否存在LISTENING状态的Socket:

  • 若存在LISTENING状态,说明监听Socket正常运行,FIN_WAIT2只是已关闭的会话连接,不会影响其他应用发起新连接。
  • 若不存在LISTENING状态,说明现金装填机的监听程序已退出,需重启其服务或设备;如果是你负责现金装填机的程序逻辑,要确保监听Socket调用Listen()后,通过循环调用Accept()持续接受新连接,处理完单个会话后仅关闭该会话Socket,而非监听Socket。

2. 优化C#客户端的Socket关闭逻辑

即使移除client.Close()和stream.Close(),应用关闭时CLR会自动释放Socket资源,导致连接进入FIN_WAIT2。正确的关闭方式应保证TCP连接优雅断开:

  • 在发送完指令并接收响应后,先调用client.Shutdown(SocketShutdown.Both),再调用client.Close(),确保双方完成数据交互后再断开连接。
  • 若希望客户端连接关闭后,服务端的会话Socket快速回收,可设置Socket选项:
    // 禁用 linger,让连接快速回收
    client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false);
    // 或者设置 linger 时间为0,强制关闭连接
    client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(true, 0));
    

3. 调整TCP系统参数(Windows环境)

若FIN_WAIT2状态的连接持续占用端口,可通过修改系统参数加速回收:

  • 以管理员权限打开命令提示符,执行:
    netsh int tcp set global finwait2timeout=30
    
    将FIN_WAIT2的超时时间从默认120秒改为30秒,加快连接资源释放。

4. 检查第三方设备配置(若现金装填机为商用设备)

如果现金装填机是第三方设备,查看其是否支持端口复用或快速连接回收的配置选项,部分设备可通过管理界面调整TCP超时参数,避免连接长时间处于FIN_WAIT2状态。

内容的提问来源于stack exchange,提问作者Joaquin Martinez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:42:44