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




