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

C#多本地端口转发实现求助:CSV配置读取后的端口添加问题

多端口转发实现修正方案

现有代码的问题点

  • 单个portStaticODBC变量会被循环覆盖,最终仅能保留最后一个端口实例,外部的Start()也只会启动这一个
  • 逻辑矛盾:判断行包含;,但实际用,分割字符串
  • 远程端口错误复用了本地端口的索引dnsPort[1],应该用dnsPort[3]
  • 空catch会掩盖解析或端口创建的错误,不利于排查问题
  • 端口启动位置混乱,部分在循环内部分在循环外,容易导致重复启动或漏启动

修正后的实现代码

// 用集合存储所有端口实例,避免被覆盖
List<ForwardedPortLocal> forwardedPorts = new List<ForwardedPortLocal>();

var configPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "configSrv1.csv");
var lines = System.IO.File.ReadLines(configPath);

foreach (string line in lines)
{
    // 跳过注释行和空行
    if (string.IsNullOrWhiteSpace(line) || line.StartsWith("#"))
        continue;

    try
    {
        // 按逗号分割(若实际配置用;分隔,可改为Split(';'))
        string[] parts = line.Split(',', StringSplitOptions.RemoveEmptyEntries);
        // 确保配置行有足够字段
        if (parts.Length != 4)
        {
            Console.WriteLine($"无效配置行:{line},正确格式应为 本地IP,本地端口,远程IP,远程端口");
            continue;
        }

        string ipLocal = parts[0].Trim();
        if (!uint.TryParse(parts[1].Trim(), out uint portLocal))
        {
            Console.WriteLine($"本地端口格式错误:{parts[1]}");
            continue;
        }

        string ipRemote = parts[2].Trim();
        if (!uint.TryParse(parts[3].Trim(), out uint portRemote))
        {
            Console.WriteLine($"远程端口格式错误:{parts[3]}");
            continue;
        }

        // 创建新的端口转发实例
        var portForward = new ForwardedPortLocal(ipLocal, portLocal, ipRemote, portRemote);
        forwardedPorts.Add(portForward);
        
        // 添加到客户端并启动转发
        clientServer1.AddForwardedPort(portForward);
        portForward.Start();
        Console.WriteLine($"已启动端口转发:{ipLocal}:{portLocal} -> {ipRemote}:{portRemote}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"处理配置行出错:{line},错误信息:{ex.Message}");
    }
}

// 后续如需统一管理端口,可遍历集合操作,比如停止所有转发
// foreach(var port in forwardedPorts)
// {
//     port.Stop();
// }

关键说明

  • 使用List<ForwardedPortLocal>存储所有端口实例,确保每个转发配置都能被保留和后续管理
  • 修正分隔符逻辑,增加字段长度校验,避免数组索引越界
  • 用uint.TryParse替代直接强制转换,避免格式错误导致程序崩溃
  • 保留异常信息输出,方便排查配置或端口启动问题
  • 每个端口实例在创建后立即添加到客户端并启动,确保所有配置生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:05:18