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

Xamarin Android 接收网络客户端UDP广播时出现SocketException访问被拒问题

问题根因与解决方案

1. 核心问题:绑定了系统特权端口

Android基于Linux内核,1024以下的端口属于系统特权端口,普通应用没有权限直接绑定,你当前代码中绑定的80端口刚好属于特权端口范围,这是触发Access denied异常的最主要原因。

临时测试可以直接把端口替换为1024~65535之间未被占用的高位端口,比如常用的8080、9000等即可解决。

2. 补充申请Android网络权限

需要在Xamarin.Android项目的AndroidManifest.xml配置文件中添加必要的网络权限,否则即使使用高位端口也可能触发权限报错:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

3. 优化后的代码示例

注意不要将UDP接收的阻塞逻辑放到主线程执行,否则会触发应用无响应(ANR),建议放到子线程或者采用异步API实现:

public async Task DemoAsync()
{
    // 替换为1024以上的自定义端口
    var server = new UdpClient(8080);
    var responseData = Encoding.ASCII.GetBytes("SomeResponseData");

    while (true)
    {
        // 异步接收避免阻塞主线程
        var receiveResult = await server.ReceiveAsync();
        var clientRequest = Encoding.ASCII.GetString(receiveResult.Buffer);
        var clientAddress = receiveResult.RemoteEndPoint.Address.ToString();
        
        Console.WriteLine("Received {0} from {1}, sending response", clientRequest, clientAddress);
        await server.SendAsync(responseData, responseData.Length, receiveResult.RemoteEndPoint);
    }
}

特殊场景:必须使用80端口的解决方案

如果业务要求必须监听80端口,需要在已经root的设备上通过iptables做端口转发,将所有发往80端口的UDP请求转发到你使用的高位端口即可:

iptables -t nat -A PREROUTING -p udp --dport 80 -j REDIRECT --to-port 8080

内容的提问来源于stack exchange,提问作者Nils.wtf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:06:03