我正在开发一个服务器客户端应用程序。 Yhe服务器侦听某个端口(例如:9090)。 但我很困惑:
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9090);
server.Bind(ep);
server.Listen(100);
答案 0 :(得分:8)
您立即终止程序,并显示一条错误消息,指出该端口已在使用中。
这也是其他人所做的。
(当然端口号应该是可配置的。)
答案 1 :(得分:2)
您有两种选择:
1)放弃 - 向用户/来电者报告错误 2)使用另一个端口
2)的问题是,任何希望使用您的服务的人都需要知道新端口才能访问您的服务(而不是在原始默认端口上运行的端口)。
答案 2 :(得分:1)
完整的答案是,如果问题发生,除了失败和抱怨之外做一些事情已经太晚了:端口已经被占用了。根据当地规则,您可以发明一些高级政策,例如杀死占据港口的任务,但这会产生奇怪的后果。最终适当的政策是避免这种情况的可能性。
完整端口范围(1-65535)通常分为几个子范围。 1-1023范围是传统的“特权”范围,因此它的端口只能由超级用户分配。这是Unix系统上传统上严格的策略,但不适用于Windows。当未明确指定端口号时,范围49152-65535是当前IANA推荐的自动分配 - 典型情况是传出连接。但这是后期标准。默认情况下,当前Linux为此定义32768-61000。 Windows在版本AFAIK到Vista之前将自动范围定义为1024-65535,并将其缩减为IANA建议。因此,如果服务不是从系统启动启动的话,以前的版本可能会对端口号产生自发冲突。如果你使用现代操作系统,它不太可能与1024-32767范围内的自动分配发生冲突,但它在上限范围内太高了。
另一个问题是故意分配您的服务使用的端口。这只能使用端口号上的ACL来避免,这是非常特定于操作系统的。我想有Windows的这种实现,但从未见过任何。 OTOH,IANA建议每个软件作者在真正使用之前注册使用端口,这样可以最大限度地减少与其他软件发生冲突的可能性。
如果你想使用非注册但固定的端口,尽量避免使用9090的漂亮数字,因为它们不仅仅适合你:)使用随机数生成器并重试尝试,直到你得到一个未列为的数字注册
答案 3 :(得分:0)
使端口可配置。
这将允许用户决定另一个(可用的)端口。
答案 4 :(得分:0)
购买另一个方框,为其分配一个新的IP地址,然后运行您的应用。
我看到你关心用户,如何提前告诉他们使用哪个端口。假设您的软件无论出于何种原因都可以轻松更改端口。
第三种解决方案是使用VM和新的OS实例。我不是虚拟机的真正粉丝,所以即使它是企业界的宠儿,我也不会支持这种方法。顺便说一句,除非你是在一台机器上放置很多关键企业服务的类型,然后在服务器崩溃时耸耸肩,否则VM并不坏。