C# 在iOS上调用TcpListener.Start()时,如何避免拒绝访问错误?

C# 在iOS上调用TcpListener.Start()时,如何避免拒绝访问错误?,c#,ios,sockets,mono,C#,Ios,Sockets,Mono,在iOS应用程序中,我试图调用TcpListener实例。我定义并启动侦听器,如下所示: var listener = new TcpListener(IPAddress.Any, 104); listener.Start(); 但是,当我运行此代码(iOS模拟器、iPhone、调试模式)时,会出现以下异常: System.Net.Sockets.SocketException:访问被拒绝 在/Developer/MonoTouch/Source/mono/mcs/class/System/S

在iOS应用程序中,我试图调用
TcpListener
实例。我定义并启动侦听器,如下所示:

var listener = new TcpListener(IPAddress.Any, 104);
listener.Start();
但是,当我运行此代码(iOS模拟器、iPhone、调试模式)时,会出现以下异常:

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


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

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

这在中有所说明,其中给出了端口列表:

DICOM已由互联网分配号码管理局(IANA)保留以下TCP和UDP端口号:

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


(wikipedia页面,emphasis mine)

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