在我的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运行时的内置限制吗?
答案 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端口标准建议但不要求使用这些端口号。
(维基百科的页面,强调我的)