如果端口被另一个应用程序占用,该怎么办?

3

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

如果计算机上的另一个应用程序已经占用了该端口,开发人员该怎么办?他们如何处理这种情况?

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

4
选择一个不同的端口? - Oded
1
@Oded 当用户使用应用程序时,我不会在那里。 - Murhaf Sousli
有一系列的数字被保留用于“众所周知”的端口。此外,许多TCP/IP堆栈允许您保留一块端口号,以便它们不可用于自动分配。您负责确保只运行一个服务器实例。 - HABO
5个回答

8

你立即以错误消息终止程序,提示端口已经在使用中。

其他人也是这样做的。

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


2
你有两个选择:
1)放弃——向用户/调用者报告错误 2)使用另一个端口
第二种选择的问题在于,谁想要使用你的服务就需要知道新的端口才能访问你的服务(而不是运行在原始默认端口上的服务)。

2
完整的答案是,如果出现问题,除了失败和抱怨之外,已经太晚了:端口已经被占用。根据本地规定,您可以发明一些高级策略,例如杀死占用端口的任务,但这可能会产生奇怪的后果。最终的适当策略是避免出现这种情况的可能性。
完整的端口范围(1-65535)通常被分成一些子范围。范围1-1023是传统的“特权”范围,因此只有超级用户才能分配来自该范围的端口。这在Unix系统上是传统的严格政策,但在Windows上不是。范围49152-65535是当前IANA推荐的自动分配范围,当没有明确指定端口号时使用 - 典型情况是出站连接。但这是一个较晚的标准。当前的Linux默认为32768-61000。Windows在我所知道的版本中将自动范围定义为1024-65535,在Vista中它被缩小到IANA建议。因此,以前的版本可能会因为服务不是从系统启动开始而导致端口号的自发冲突。如果您使用现代操作系统,则很难在1024-32767的自动分配范围内发生冲突,但在上限范围内太高。
另一个问题是分配用于您的服务的端口。这只能通过对端口号使用ACL来避免,这非常依赖于操作系统。我猜在Windows上有这样的实现,但从未见过。另一方面,IANA建议每个软件作者在真正使用端口之前注册使用的端口,因此这有助于最小化与其他软件的冲突机会。
如果您想使用未注册但固定的端口,请尝试避免漂亮的数字,例如9090,因为它们不仅对您而言很漂亮:)使用随机数生成器并重试尝试,直到获得未列为注册的号码。

0

使端口可配置。

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


0

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

我看到您关心用户,那么提前告诉他们使用哪个端口如何?这是假设您的软件可以轻松更改端口的情况下。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接