8 use Socket qw(PF_INET6 PF_INET IPPROTO_IPV6 IPV6_V6ONLY);
11 eval { IO::Socket::IP->new( LocalHost => "::1" ) } or
12 plan skip_all => "Unable to bind to ::1";
14 eval { defined IPV6_V6ONLY } or
15 plan skip_all => "IPV6_V6ONLY not available";
17 # https://rt.cpan.org/Ticket/Display.html?id=102662
19 plan skip_all => "$^O: IPV6_V6ONLY exists but getnameinfo() fails with EAI_NONAME";
21 # Don't be locale-sensitive
22 $! = Errno::ECONNREFUSED;
23 my $ECONNREFUSED_STR = "$!";
26 my $listensock = IO::Socket::IP->new(
32 GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
33 ) or die "Cannot listen on PF_INET6 - $@";
35 is( $listensock->getsockopt( IPPROTO_IPV6, IPV6_V6ONLY ), 1, 'IPV6_V6ONLY is 1 on $listensock' );
37 my $testsock = IO::Socket::IP->new(
39 PeerHost => "127.0.0.1",
40 PeerPort => $listensock->sockport,
42 GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
46 ok( !defined $testsock, 'Unable to connect PF_INET socket to PF_INET6 socket with V6Only true' );
47 like( $err, qr/\Q$ECONNREFUSED_STR/, 'Socket creation fails with connection refused' );
51 skip "This platform does not allow turning IPV6_V6ONLY off", 3 unless IO::Socket::IP->CAN_DISABLE_V6ONLY;
53 local $ENV{LANG} = "C"; # avoid locale-dependent error messages
55 my $listensock = IO::Socket::IP->new(
61 GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
62 ) or die "Cannot listen on PF_INET6 - $@";
64 is( $listensock->getsockopt( IPPROTO_IPV6, IPV6_V6ONLY ), 0, 'IPV6_V6ONLY is 0 on $listensock' );
66 my $testsock = IO::Socket::IP->new(
68 PeerHost => "127.0.0.1",
69 PeerPort => $listensock->sockport,
71 GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
75 ok( defined $testsock, 'Connected PF_INET socket to PF_INET6 socket with V6Only false' ) or
76 diag( "IO::Socket::IP->new failed - $err" );
77 is( $testsock->peerport, $listensock->sockport, 'Test socket connected to correct peer port' );