3

(如果重复,请关闭此线程,我努力了,但找不到任何匹配的问题)

似乎某些操作系统/平台在绑定到 IPv6 通配符地址时会同时监听 IPv6 和 IPv4 (tcp) 连接,而有些操作系统/平台仅监听 IPv6,如下所述:

对于 V6Only 参数

使用以下几行:

如果您的平台不支持禁用此选项,但您仍想同时侦听 AF_INET 和 AF_INET6 连接,则必须创建两个侦听套接字,一个绑定到每个协议

在“ IPv6 如何在 Java 平台上工作”一节中

根据这个 SO question 中的正确答案

现在我想编写一些 Perl 代码,它可以确定底层操作系统/平台是否同时监听 IPv6 和 IPv4(如果绑定到 IPv6),如果是,我将只绑定到 IPv6,如果没有,我将创建 2 个套接字( 1 个用于 IPv4,另一个用于 IPv6)。

我想知道这可能是最好的方法吗?

IO::Socket::IP中所述,我可以使用

if( IO::Socket::IP->CAN_DISABLE_V6ONLY ) {
    ...
}
else {
    ...
}

但是,我不确定它是否会准确地告诉我

如果底层操作系统/平台同时监听 IPv6 和 IPv4(如果绑定到 IPv6)

或者它只会告诉

不能禁用 IPV6_V6ONLY 套接字选项

4

1 回答 1

4

它只是告诉“不能禁用 IPV6_V6ONLY 套接字选项”

这是对的。

您可以尝试创建一个 PF_INET6 套接字,然后如果成功,请检查其 IPV6_V6ONLY 套接字选项。如果这是真的,那么套接字只监听 IPv6 而不是 IPv4,所以你必须创建另一个。如果为 false,则套接字将同时捕获 IPv6 和 IPv4,而这一个套接字就足够了。

于 2012-09-27T14:27:36.620 回答