我正在尝试开始侦听 Android 设备上的 UDP 端口之一。我正在使用 Xamarin.Forms,并在物理 Android 手机上测试它。
public void StartListening(int port = 13000)
{
ListenerPort = port;
udpClient = new UdpClient(ListenerPort);
udpClient.BeginReceive(new AsyncCallback(handleIncomingMessages), null);
}
该函数在应用程序启动时使用:
public partial class App : Application
{
[...]
protected override void OnStart()
{
network.StartListening(LISTENING_ON_PORT);
}
}
SO 上有很多类似的问题,但大多数都是通过向 android 清单添加 INTERNET 权限来解决的。这是我的:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.ddand">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:label="ddAnd.Android" android:theme="@style/MainTheme"></application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
</manifest>
部署我的应用程序后我看到的是:
System.Net.Sockets.SocketException:“访问被拒绝”
并且没有提供其他细节。
我认为我的端口正在被另一个进程使用,但我检查了其中的许多端口(在 1-1024 范围之外),并且使用所有端口都给出了相同的结果。
是否还有其他原因导致此异常?您对如何解决问题有任何想法吗(例如如何找到可用端口)?
EDIT:
正如评论中所建议的,我尝试在运行时获得访问权限(尽管这不是必需的,Xamarin 在调试模式下默认授予 INTERNET 权限 https://learn.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=windows).
该行返回已授予权限的信息。
var havePermission = ContextCompat.CheckSelfPermission(this, Manifest.Permission.Internet);
尽管如此,我还是尝试在运行时手动获取访问权限
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Internet }, 1);
结果和以前一样。