【问题标题】:SocketException: "access denied" while opening port using UdpClientSocketException:使用 UdpClient 打开端口时出现“访问被拒绝”
【发布时间】:2020-08-10 14:09:09
【问题描述】:

我正在尝试开始侦听 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 manifest 中添加 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 范围之外)并且使用它们都得到了相同的结果。

这个例外还有其他原因吗?您有什么想法可以解决问题(例如如何找到可用端口)?

编辑:

按照 cmets 中的建议,我尝试在运行时获得访问权限(尽管这不是必需的,INTERNET permission is granted by default by Xamarin in Debug mode)。

此行返回已授予权限的信息。

var havePermission = ContextCompat.CheckSelfPermission(this, Manifest.Permission.Internet);

尽管如此,我还是尝试在运行时手动获取访问权限

ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Internet }, 1);

结果和以前一样。

【问题讨论】:

  • 如何添加权限?仅将其添加到AndroidManifest 文件中?您是否请求运行时权限?
  • 仅添加到清单。感谢您的评论,我会检查我是否遗漏了什么
  • @WendyZang-MSFT 嗨,我已经编辑了我的帖子来回答你的建议。通常,Android 表示已授予 INTERNET 权限。此外,如 xamarin 文档中所述,不需要在运行时请求它

标签: c# android xamarin xamarin.forms xamarin.android


【解决方案1】:

你可以试试下面的代码吗? (改编自documentation

public void StartListening(int port = 13000)
{
    ListenerPort = port;
    IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, ListenerPort);
    udpClient = new UdpClient(ipEndPoint);
    
    UdpState udpState = new UdpState();
    udpState.e = ipEndPoint;
    udpState.u = udpClient;

    udpState.BeginReceive(new AsyncCallback(handleIncomingMessages), udpState);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2014-12-22
    • 2012-07-26
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多