You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C# TCP/IP监听报错:请求的地址在其上下文中无效求修正方案

解决TCP监听“请求的地址在其上下文中无效”的问题

问题原因

你遇到的错误核心在于:你把TcpListener绑定到了发送数据的机器的IP(10.3.0.234),但你的监听程序运行在另一台机器上——这个IP并不是当前机器网卡配置的有效地址,系统无法在当前机器上绑定一个不属于它的IP,因此抛出了异常。

修正方案

要实现跨机器TCP通信,监听端需要绑定当前机器的有效IP地址,最通用的方式是使用IPAddress.Any:它会让TcpListener监听当前机器所有网卡的指定端口,来自任何IP的连接请求都能被接收,完美适配跨机器通信场景。

修正后的完整代码

TcpListener server = null;
try
{
    // 设置监听端口
    Int32 port = 5555;
    // 使用IPAddress.Any监听所有网卡的请求,替代原发送端IP
    IPAddress localAddr = IPAddress.Any;

    // 初始化TcpListener
    server = new TcpListener(localAddr, port);
    // 开始监听客户端请求
    server.Start();

    Console.WriteLine("服务器已启动,正在监听端口 {0}...", port);

    // 数据缓冲区
    Byte[] bytes = new Byte[256];
    String data = null;

    // 持续监听循环
    while (true)
    {
        Console.Write("等待客户端连接... ");
        // 阻塞等待客户端连接
        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("客户端已连接!");

        data = null;
        // 获取网络流用于读写数据
        NetworkStream stream = client.GetStream();
        int i;

        // 循环接收客户端发送的数据
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
            // 将字节转换为ASCII字符串
            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
            Console.WriteLine("收到数据: {0}", data);

            // 处理数据:转为大写
            data = data.ToUpper();
            byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
            Console.WriteLine("准备发送响应: {0}", data);

            // 发送响应给客户端(恢复了你注释掉的代码)
            stream.Write(msg, 0, msg.Length);
            Console.WriteLine("响应已发送");
        }

        // 关闭客户端连接
        client.Close();
        Console.WriteLine("客户端连接已关闭");
    }
}
catch (SocketException e)
{
    Console.WriteLine("Socket异常: {0}", e.Message);
}
finally
{
    // 停止监听(增加空判断避免空引用)
    if (server != null)
    {
        server.Stop();
        Console.WriteLine("服务器已停止");
    }
}

关键补充说明

  • IPAddress.Any的优势:无需手动指定当前机器的IP,自动适配所有网络接口(内网、外网网卡),不管你的机器IP怎么变,监听都能正常工作。
  • 若需指定特定IP:可以通过Dns.GetHostEntry(Dns.GetHostName()).AddressList枚举当前机器的所有可用IP,选择一个内网/外网IP绑定(比如你的机器内网IP是192.168.1.100,就用IPAddress.Parse("192.168.1.100"))。
  • 防火墙注意事项:跨机器通信时,要确保监听端的防火墙允许5555端口的入站连接,否则客户端会无法建立连接。

内容的提问来源于stack exchange,提问作者Ammar Muhi ud din

火山引擎 最新活动