【问题标题】:How can I avoid Access Denied error when calling TcpListener.Start() on iOS?在 iOS 上调用 TcpListener.Start() 时如何避免访问被拒绝错误?
【发布时间】:2013-10-29 08:41:57
【问题描述】:

在我的 iOS 应用程序中,我试图调用 TcpListener 实例。我定义和启动监听器如下:

var listener = new TcpListener(IPAddress.Any, 104);
listener.Start();

但是,当我运行此代码(iOS 模拟器、iPhone、调试模式)时出现以下异常:

System.Net.Sockets.SocketException:访问被拒绝 在 System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end) [0x00051] 在 /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net.Sockets/Socket.cs:1111 在 System.Net.Sockets.TcpListener.Start (Int32 backlog) [0x00022] 在 /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net.Sockets/TcpListener.cs:259 在 System.Net.Sockets.TcpListener.Start () [0x00000] 在 /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net.Sockets/TcpListener.cs:239 在
...

我可以做些什么来避免 Access denied 错误,或者这是 Xamarin.iOS 上 Mono 运行时的内置限制?

【问题讨论】:

  • 如果没有管理员权限,您无法绑定到 1024 的端口。这是一般限制——如果以普通用户身份运行,您会在 Windows 上遇到同样的问题。这在 DICOM 的维基百科页面中有说明
  • 谢谢,@Petesh。我已尝试使用端口 > 1024,但收到相同的错误消息。
  • 现阶段,我不知道。在 iOS 上绑定到 INADDR_ANY 适用于本机应用程序。使用端口 104 是我在您的代码中看到的最大危险信号
  • 好的,很高兴知道。您知道启用 TCP 侦听是否需要任何配置?我在 Xamarin Studio iOS 项目设置中找不到任何特定内容,但可能有一些必需的自定义命令或?
  • 您可能需要使用netstat -ln | grep <port> 来检查您选择的新端口是否尚未使用。

标签: c# ios sockets mono


【解决方案1】:

如果没有管理权限,您不能绑定到端口 1024。为此目的使用端口 >= 1024。这是一个一般限制 - 如果在大多数操作系统中以普通用户身份运行,您在任何应用程序上都会遇到相同的问题。

这在wikipedia page for DICOM 中有说明,它提供了端口列表:

DICOM 已由 Internet 编号分配机构 (IANA) 保留以下 TCP 和 UDP 端口号:

  • 104 DICOM 通过传输控制协议 (TCP) 或用户数据报协议 (UDP) 的知名端口。由于 104 在保留子集中,许多操作系统需要特殊权限才能使用它
  • 2761 使用基于 TCP 或 UDP 的集成安全通信层 (ISCL) 为 DICOM 注册的端口
  • 2762 使用 TCP 或 UDP 上的传输层安全 (TLS) 为 DICOM 注册的端口
  • 11112 通过 TCP 或 UDP 使用标准开放式通信为 DICOM 注册端口

标准推荐但不要求使用这些端口号。

(来自维基百科的页面,强调我的)

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多