C# UDP程序在两台静态IP PC间通信报请求地址无效如何解决
报错原因
- 绑定IP不属于当前运行主机的有效网卡地址:代码中硬编码接收套接字绑定IP为固定值
192.168.2.1,该IP仅为服务器主机的网卡地址。若将代码直接部署到客户端(IP为192.168.2.2)运行,Bind操作尝试绑定本机不存在的IP,就会触发该错误。 - 发送逻辑冗余导致地址上下文错误:UDP为无连接协议,代码中每次发送数据前调用
Connect方法属于冗余操作,多次调用可能导致套接字地址上下文异常,触发同类报错。
解决方案
- 适配绑定IP配置
两种方案二选一即可:- 按部署环境修改固定IP:服务器运行时保持
udpBindingIp = "192.168.2.1",客户端运行时修改为udpBindingIp = "192.168.2.2" - 通用无侵入适配:将
udpBindingIp改为IPAddress.Any.ToString(),套接字会自动绑定本机所有可用网卡的对应端口,无需根据部署环境修改代码
- 按部署环境修改固定IP:服务器运行时保持
- 优化UDP发送逻辑
移除冗余的Connect调用,改用UDP专用的BeginSendTo方法发送数据,修改后的Send方法参考实现:
private static void Send(string text) { try { byte[] data = Encoding.ASCII.GetBytes(text); // 直接指定目标地址发送,无需提前Connect socketSender.BeginSendTo(data, 0, data.Length, SocketFlags.None, epTo, (ar) => { State so = (State)ar.AsyncState; int bytes = socketSender.EndSendTo(ar); }, state); } catch (Exception e) { Console.WriteLine("发送异常:" + e.Message); } }
- 可选补充配置
为发送套接字显式绑定端口,避免系统随机分配端口被防火墙拦截,在Main方法的socketSender初始化后添加如下代码:
socketSender.Bind(new IPEndPoint(IPAddress.Any, udpBindingPort + 1));
同时确认两台主机的防火墙均已开放27000、27001端口的UDP入站、出站规则。
内容的提问来源于stack exchange,提问作者fillibuster
相关产品推荐
相关产品推荐

