【问题标题】:Check for port in use when there are multiple interfaces有多个接口时检查正在使用的端口
【发布时间】:2024-09-17 06:40:02
【问题描述】:

我知道对于 TCP,我们一次只能让一个应用程序监听一个端口。现在,如果您有 2 个网卡,则可以让一个应用程序使用相同的端口号侦听第一个 IP 和第二个 IP 上的第二个应用程序。

现在在这种情况下,如果我必须检查特定端口是否正在使用,我该怎么做?

我的意图是即使有多个接口,一个端口也只能由一个应用程序使用。如果我列出所有接口并在循环中与所有这些接口绑定端口号是否可以,或者有没有更好的方法来做这个检查。

【问题讨论】:

    标签: java tcp network-programming serversocket


    【解决方案1】:

    我知道对于 TCP,我们一次只能让一个应用程序监听一个端口。

    以下除外。

    现在,如果您有 2 个网卡,您可以让一个应用程序使用相同的端口号在第一个 IP 上侦听,第二个在第二个 IP 上侦听。

    正确。

    现在在这种情况下,如果我必须检查特定端口是否正在使用,我该怎么做?

    见下文。

    我的意图是即使有多个接口,我的唯一应用程序也应该使用一个端口。如果我列出所有接口并在循环中与所有这些接口绑定端口号是否可以,或者有没有更好的方法来做这个检查。

    只需将其绑定到0.0.0.0:port。在 Java 中,这意味着一个空的 InetAddress 和一个非零端口号。如果有任何应用程序在特定的接口和相同的端口号上侦听,您将获得BindException。相反,如果您是第一个,它将完全阻止任何其他应用程序以任何方式绑定到该端口。

    【讨论】:

    • 我猜这仅与 IPv4 地址有关……如果有 IPv6 地址怎么办?我也可以看看任何例子吗
    • InetAddress 适用于 IPv6 以及 Java 中的 IPv4。我不知道是什么让你猜测。
    • 我刚读到这里*.com/a/11110685/134713,对 ipv6 有一些疑问
    • 你真的尝试过一个空的InetAddress吗?还是你只是要继续阅读并永远积累“怀疑”?
    • 请注意,您的链接中没有任何关于使用空 InetAddress 的内容,更不用说任何说它在 IPv6 中不起作用的内容了。
    最近更新 更多