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

时间:2013-10-29 08:41:58

标签: 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/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:239中的System.Net.Sockets.TcpListener.Start()[0x00000]     在... ...

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

1 个答案:

答案 0 :(得分:5)

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

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

  

DICOM已通过互联网号码分配机构(IANA)保留以下TCP和UDP端口号:

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

标准建议但不要求使用这些端口号。

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