Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果端口已被其他应用程序占用,该怎么办?_C#_Port - Fatal编程技术网

C# 如果端口已被其他应用程序占用,该怎么办?

C# 如果端口已被其他应用程序占用,该怎么办?,c#,port,C#,Port,我正在开发一个服务器客户端应用程序。服务器侦听某个端口(例如:9090) 如果计算机已在另一个应用程序中使用该端口,该怎么办?开发人员如何处理它 Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9090); server.Bind(ep); server.Listen(

我正在开发一个服务器客户端应用程序。服务器侦听某个端口(例如:9090)

如果计算机已在另一个应用程序中使用该端口,该怎么办?开发人员如何处理它

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9090);
server.Bind(ep);
server.Listen(100);

使端口可配置


这将允许用户决定另一个(可用)端口。

您立即终止程序,并显示一条错误消息,说明该端口已在使用中

其他人也是这样做的

(当然,端口号应该是可配置的。)

您有两个选项:

1) 放弃--向用户/呼叫方报告错误
2) 使用其他端口


2)的问题是,任何希望使用您的服务的人都需要知道新端口,然后才能访问您的服务(而不是在原始默认端口上运行的服务)。

购买另一个盒子,为其分配一个新的IP地址,然后运行您的应用程序

我知道你很关心用户,不如提前告诉他们使用哪个端口。这是假设您的软件可以很容易地改变端口的任何原因


第三种解决方案是使用虚拟机和新的操作系统实例。我不是虚拟机的真正粉丝,所以我不会支持这种方法,即使它是企业界的宠儿。顺便说一句,虚拟机并不坏,除非你是那种将许多关键的公司服务放在一台机器上,然后在服务器崩溃时耸耸肩的人

完整的答案是,如果问题发生,除了失败和抱怨之外,现在做任何事情都为时已晚:端口已被占用。根据本地规则,您可以发明一些高级策略,例如杀死占用端口的任务,但这可能会产生奇怪的后果。最后,正确的政策是避免出现这种情况

全端口范围(1-65535)通常分为若干子范围。范围1-1023是传统的“特权”范围,因此它的端口只能由超级用户分配。这在Unix系统上是传统上严格的策略,但在Windows上不是。49152-65535范围是当前IANA建议的在未明确指定端口号时自动分配的范围-典型情况是传出连接。但这是晚标准。当前Linux默认为此定义32768-61000。在AFAIK到Vista的版本中,Windows将自动范围定义为1024-65535,并将其减少到IANA建议的范围。因此,如果服务不是从系统启动时启动的,则以前的版本可能会在端口号方面发生自发冲突。如果您使用现代操作系统,它不太可能与1024-32767范围内的自动分配发生冲突,但在上限范围内它太高了

另一个问题是有意分配服务使用的端口。这只能通过在端口号上使用ACL来避免,这是非常特定于操作系统的。我想有这样的Windows实现,但从未见过。OTOH,IANA建议每个软件作者在真正使用它之前注册使用的端口,所以这有助于最大限度地减少与其他软件发生冲突的机会


如果要使用未注册但固定的端口,尽量避免使用9090这样的漂亮数字,因为它们不仅适合你:)使用随机数生成器,然后重试,直到得到一个未注册的数字。

选择其他端口?@Oded当用户使用应用程序时,我不会在那里。为“已知”端口保留一系列数字。此外,许多TCP/IP堆栈允许您保留一组端口号,以便它们不可用于自动分配。您负责确保只有一个服务器实例正在运行。