iOS 17下MAUI+.NET 8 UDP发送报SocketException(65)问题求助
iOS 17上MAUI .NET 8 UDP发送报错SocketException(65):No route to host 解决方案
问题定位
你遇到的System.Net.Sockets.SocketException(65): No route to host错误,在Windows/Android正常但iOS 17异常,核心原因通常是iOS 17的本地网络权限限制、代码逻辑错误,或者设备网络配置问题。
具体解决步骤
1. 修正代码中的类型混淆错误
你的代码里存在TcpClient和UdpClient的混用问题,这会导致异常。修正后的UDP收发代码如下:
// 正确初始化UdpClient UdpClient udpClient = new UdpClient(); // 目标端点:替换为路由器的局域网IP和端口 IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.x.x"), 57788); udpClient.Send(requestBytes, requestBytes.Length, remoteEP); // 设置接收超时(注意是UdpClient的Client属性) udpClient.Client.ReceiveTimeout = 3000; byte[] responseBytes = udpClient.Receive(ref remoteEP);
2. 主动申请本地网络权限
iOS 14及以上版本要求App主动向用户申请本地网络权限,仅靠info.plist配置无法自动获取权限。在App启动或功能初始化时添加权限请求:
// 示例:在页面的OnAppearing方法中调用 protected override async void OnAppearing() { base.OnAppearing(); var status = await Permissions.RequestAsync<Permissions.LocalNetwork>(); if (status != PermissionStatus.Granted) { // 提示用户前往设置开启权限 await DisplayAlert("权限不足", "需要开启本地网络权限才能通信", "确定"); } }
3. 完善info.plist的网络权限配置
除了你已有的配置,添加NSBonjourServices项(iOS 17对本地网络权限验证更严格,即使不使用Bonjour也需要配置):
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSAllowsLocalNetworking</key> <true/> </dict> <key>NSLocalNetworkUsageDescription</key> <string>This app needs access to the local network to communicate with devices.</string> <!-- 添加以下配置 --> <key>NSBonjourServices</key> <array> <string>_udp._tcp.</string> <string>_custom-service._udp.</string> <!-- 可替换为你的UDP服务标识,或保留通用项 --> </array>
4. 关闭iOS设备的「私人WiFi地址」
iOS的私人地址功能可能导致局域网路由异常,关闭步骤:
- 打开iOS设置 → WiFi
- 点击当前连接WiFi右侧的「i」图标
- 关闭「私人地址」选项,重新连接WiFi
5. 验证路由器与端口配置
- 确认目标IP是路由器的局域网IP(如192.168.1.1),而非公网IP
- 检查路由器是否拦截UDP端口57788,部分路由器默认会过滤未授权的UDP流量
- 用iOS设备ping路由器地址确认连通性(你已完成此步骤,可跳过)
6. 测试极简UDP发送逻辑
编写极简代码排除其他业务逻辑干扰,验证UDP基础功能:
using System.Net; using System.Net.Sockets; using System.Text; var udpClient = new UdpClient(); var remoteEP = new IPEndPoint(IPAddress.Parse("192.168.x.x"), 57788); var testData = Encoding.UTF8.GetBytes("UDP Test"); try { udpClient.Send(testData, testData.Length, remoteEP); Console.WriteLine("UDP数据包发送成功"); } catch (SocketException ex) { Console.WriteLine($"发送失败:{ex.Message} 错误码:{ex.ErrorCode}"); }
内容的提问来源于stack exchange,提问作者Xiaoxin
相关产品推荐
相关产品推荐

