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

WPF Socket连接问题:关闭错误提示框后无法重新连接求助

WPF Socket 重连问题修复方案

问题根源

你的代码里,socketWatch = new Socket(...)是在try块外执行的,第一次连接失败时,socketWatch已经被实例化。后续再尝试连接时,if (socketWatch == null)的判断不成立,完全不会进入连接逻辑,所以必须重启程序让socketWatch回到null状态才能重新尝试。

修复步骤

  1. 每次尝试连接前,先检查并释放已有Socket资源,避免资源占用或端口被占
  2. 移除if (socketWatch == null)的限制,让每次输入新IP/端口都能执行完整连接流程
  3. 捕获异常时重置socketWatch为null,确保下次可以重新初始化

修改后的代码示例

// 每次点击连接按钮时执行此方法
private void TryConnect()
{
    // 清理旧的Socket资源
    if (socketWatch != null)
    {
        socketWatch.Close();
        socketWatch.Dispose();
        socketWatch = null;
        dicScoket?.Clear();
    }

    try
    {
        dicScoket = new Dictionary<string, Socket>();
        socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        
        IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
        IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
        
        socketWatch.Bind(endPoint);
        socketWatch.Listen(20);
        Listen();
        Showmsg("Connected!");
    }
    catch (Exception error)
    {
        MessageBox.Show($"Error: {error.Message}"); // 显示具体错误,方便排查问题
        // 失败后强制清理Socket
        if (socketWatch != null)
        {
            socketWatch.Close();
            socketWatch.Dispose();
            socketWatch = null;
        }
    }
}

关键修改说明

  • 每次连接前强制清理旧Socket,避免资源泄漏或端口占用
  • 移除if (socketWatch == null)判断,确保每次输入新参数都能触发连接逻辑
  • 异常捕获中增加Socket清理,保证失败后状态可重置
  • 错误提示显示具体异常信息,便于定位IP/端口的具体问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:35:41