(如果重复,请关闭此帖子,我努力了,但找不到任何匹配的问题)
当绑定到IPv6 widcard地址时,某些OS /平台似乎会侦听IPv6和IPv4(tcp)连接,而有些只监听IPv6,如下所述:
使用以下行:
如果您的平台不支持禁用此选项但您仍想监听AF_INET和AF_INET6连接,则必须创建两个侦听套接字,一个绑定到每个协议
在“How IPv6 Works on a Java Platform”部分
并按照正确答案in this SO question
现在我想写一些Perl代码,它可以确定底层OS /平台是否同时监听IPv6和IPv4(如果绑定到IPv6),如果是,我将仅绑定到IPv6,如果不是,我将创建2个套接字( 1表示IPv4,另一表示IPv6 .
我想知道最好的方法是什么?
如_1565942中所述,我可以使用
if( IO::Socket::IP->CAN_DISABLE_V6ONLY ) {
...
}
else {
...
}
但是,我不确定它是否会告诉我
如果底层OS /平台同时侦听IPv6和IPv4(如果绑定到IPv6)
或者它只会告诉你
无法禁用IPV6_V6ONLY套接字选项
1 回答
这是对的 .
您可以做的是尝试创建PF_INET6套接字,如果成功,请检查其IPV6_V6ONLY套接字选项 . 如果这是真的,那么套接字只能侦听IPv6而不是IPv4,所以你必须创建另一个 . 如果为false,则套接字将捕获IPv6和IPv4,并且这一个套接字就足够了 .