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

C# SuperSimpleTCP客户端连接Cisco OpenConnect VPN时TCP连接异常

解决C# SuperSimpleTCP应用在Cisco OpenConnect VPN下的通信故障

问题原因分析

出现这类故障通常和以下几点有关:

  • VPN路由冲突:连接VPN后系统默认路由转向虚拟网卡,客户端访问本地/公网服务器的流量被强制走VPN,若服务器不在VPN子网内,数据包无法到达;同时VPN的Split Tunnel(拆分隧道)若未开启,会拦截本地网络流量。
  • 端口/防火墙拦截:Cisco OpenConnect的安全策略可能拦截了25565端口的TCP流量,或服务器端防火墙未开放对应端口。
  • SuperSimpleTCP配置缺失:默认未启用TCP KeepAlive,VPN环境下网络延迟高时,服务器无法检测到客户端断开;同时客户端可能绑定了错误的网卡(虚拟网卡而非物理网卡)。
  • 服务器代码错误:事件绑定对象错误(用了client.Events而非server.Events),导致连接/断开事件完全无法触发。

分步解决方法

1. 修正服务器代码的核心错误

你的服务器代码存在事件绑定对象错误,这是导致断开事件不触发的直接原因之一,先修正:

private void Server_Form_Load(object sender, EventArgs e)
{
    // 绑定0.0.0.0监听所有网卡请求
    server = new SimpleTcpServer("0.0.0.0:25565");
    // 绑定服务器的客户端事件,而非client对象的事件
    server.Events.ClientConnected += Events_ClientConnected;
    server.Events.ClientDisconnected += Events_ClientDisconnected;
    server.Events.DataReceived += Events_DataReceived;
    server.Start();
}

// 确保事件方法名和绑定一致
private void Events_ClientConnected(object? sender, ConnectionEventArgs e)
{
    this.Invoke((MethodInvoker)delegate
    {
        txtInfo.Text += $"{e.IpPort}: Connected...{Environment.NewLine}";
    });
}

private void Events_ClientDisconnected(object? sender, ConnectionEventArgs e)
{
    this.Invoke((MethodInvoker)delegate
    {
        txtInfo.Text += $"{e.IpPort}: Disconnected...{Environment.NewLine}";
    });
}

2. 排查并修复网络连通性

  • 客户端连接VPN后,执行以下命令测试网络:
    • Ping服务器IP:ping 你的服务器IP
    • 测试端口连通性:telnet 你的服务器IP 25565
  • 如果测试失败,开启VPN的Split Tunnel(拆分隧道):在Cisco OpenConnect的设置中,允许本地网络流量绕过VPN,这样客户端访问本地服务器的流量会直接走物理网卡。
  • 若服务器在公网,确认VPN允许访问该公网IP的25565端口,必要时联系VPN管理员调整安全策略。

3. 调整客户端网卡绑定

客户端连接时,指定绑定本地物理网卡的IP,避免系统自动选择VPN虚拟网卡:

private void Client_Form_Load(object sender, EventArgs e)
{
    IPAddress serverIp = IPAddress.Parse(IP_Address);
    // 替换为你的本地物理网卡IP(比如192.168.1.100)
    IPAddress localPhysicalIp = IPAddress.Parse("192.168.1.100");
    // 使用带本地IP的重载初始化客户端
    client = new SimpleTcpClient(serverIp, 25565, localPhysicalIp);
    
    // 启用TCP KeepAlive,检测连接状态
    client.KeepAlive.EnableTcpKeepAlive = true;
    client.KeepAlive.TcpKeepAliveInterval = 5; // 每5秒发送一次保活包
    client.KeepAlive.TcpKeepAliveTime = 10; // 10秒无响应则判定连接断开
    
    client.Connect();
}

4. 优化发送逻辑并添加错误处理

客户端发送消息时,检查返回结果,及时处理发送失败的情况:

private void btnSend_Click(object sender, EventArgs e)
{
    if (!client.IsConnected)
    {
        MessageBox.Show("未连接到服务器");
        return;
    }
    if (string.IsNullOrEmpty(txtMessage.Text)) return;
    
    // 获取发送结果,判断是否成功
    var sendResult = client.Send(txtMessage.Text);
    if (!sendResult.Success)
    {
        MessageBox.Show($"发送失败:{sendResult.ErrorMessage}");
        // 尝试重新连接
        client.Reconnect();
    }
}

5. 服务器启用KeepAlive

服务器端同样启用TCP KeepAlive,确保能及时检测到客户端断开:

private void Server_Form_Load(object sender, EventArgs e)
{
    server = new SimpleTcpServer("0.0.0.0:25565");
    
    server.KeepAlive.EnableTcpKeepAlive = true;
    server.KeepAlive.TcpKeepAliveInterval = 5;
    server.KeepAlive.TcpKeepAliveTime = 10;
    
    server.Events.ClientConnected += Events_ClientConnected;
    server.Events.ClientDisconnected += Events_ClientDisconnected;
    server.Events.DataReceived += Events_DataReceived;
    server.Start();
}

内容的提问来源于stack exchange,提问作者Parsa Khatibzadeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:05:50