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
相关产品推荐
相关产品推荐

