in reply to Activeperl 5.16.1 Ipv6 support

I'd suggest you be a bit more explicit about the type of socket you want to create. It's possible the version of Perl you're using can't figure out some of the details that you're expecting to be assumed properly. Of course, it's also possible the version of Perl or some library was built without IPv6 support, in which case there's not much you can do to fix it besides recompile.

For starters, you should always define the Proto and Type of socket you create. In this case it appears you want a TCP socket of a STREAM type (TCP sockets are always streams; other types of sockets, like Unix Domain, can be one of multiple types.)

You can also enforce a desired address Family, such as AF_INET for IPv4 or AF_INET6 for IPv6. These constants are defined in the Socket Perl class (and ultimately defined in the C library sys/socket.h where Perl gets them.) If you do not declare an address family, the kernel will determine an appropriate type through a gethostbyname(3) system call. For dual-stacked hosts, this may not be what you intend when using a DNS name, like google.com instead of a raw IP. We don't usually hard-code IPs in code for IPv6, and it's even bad practice in IPv4 in most cases.

Also, you probably want to use the $! variable in errors describing system calls, such as socket creation. The $@ variable holds the text of the last eval failure (this is how you "catch" exceptions in Perl) while the $! variable holds the C errno value, which will be translated to its human-readable error text when used in a string. Update: $@ may contain higher-level details on the failure, so sometimes "Socket error: $@ ($!)" can be helpful. See perlvar docs for details.

I've given you a bit more of a complete example below that creates a TCP socket in STREAM mode to an IPv6 endpoint for google on port 80. Then it'll send a request for the homepage and print results to STDOUT. This should work anywhere provided you have a sufficiently new-enough Perl (5.20 or better) that includes IO::Socket::IP, or have obtained that module from CPAN or similar.

use strict; use warnings; require IO::Socket::IP; # Implicitly included above, yet list it explicitly: require Socket; # An IPv6 IP would work fine here too. # Feel free to hard-code the CDN IPv6 resolution if you'd like. my $host = "google.com"; my $sock = IO::Socket::IP->new( Proto => Socket->IPPROTO_TCP, Type => Socket->SOCK_STREAM, # This will force a particular address-family. # If you leave it off, the system's gethostbyname() call # will attempt to determine this automatically: Family => Socket->AF_INET6, PeerHost => $host, PeerPort => 80, Timeout => 3, ) or die "Failed to create socket: $!"; # Use Perl/IO (built on Standard I/O) to send a request for data: $sock->print("GET /\n") or die "Socket error on write: $!"; # Read loop, printing out data from socket to STDOUT. my $rc; while (1) { # Attempt to read up to 1k of data: $rc = $sock->read(my $buffer, 1024); # catch socket errors (excluding EOF): unless (defined $rc) { die "Socket error on read: $!"; } # EOF returns 0, which exits the read loop: last if ($rc == 0); # Otherwise print the line, which may be a partial line. printf "%s", $buffer; } print "\n";

Note that using a socket like this is a fairly bad way to get a webpage, but this is simply a demonstration of how you normally use a client-socket.

Replies are listed 'Best First'.
Re^2: Activeperl 5.16.1 Ipv6 support
by rama133101 (Novice) on Dec 01, 2015 at 06:45 UTC

    Thanks for the insight. I was able to reckon that the Socket library must have no support for the Ipv6. In other words, the Socket must be only Ipv4 compatible. Then I came across this bug reported months back.

    https://rt.cpan.org/Public/Bug/Display.html?id=79110#txn-1160212

    As suggested in the above bug discussion, I force installed the Socket library and now the library supports Ipv6. I dont see the error anymore.

      Good find, and I'm glad it's working for you.

      If you're interested in reporting this as a bug against Activeperl (provided the version you're using is actively supported) it might be worth your time to let them know that defaults builds of built-in classes lack IPv6 support, and presumably a brief description of the issue and a link to that bug should be all they need to fix it in later releases.

      from the looks of the CPAN bug you linked, this is an issue in the Socket class which provides some system-call integration involving address resolution, and that is what lacks IPv6 support, even when IO::Socket::IP does support it.In this day there's no good reason for out-of-the-box software not to at least support it.

        Thanks. I thought I am all set to announce that my application now supports Dual stack IP. But, the issue is still seen in Perl 5.16 32 bit. I am all set for 64 bit Perl. In case of Perl 32 bit, even after doing the "force install Socket", the below line is giving me error.

        my $sock = IO::Socket::IP->new( Family => Socket->AF_INET6, PeerHost => $ipv61, PeerPort => "22", Timeout => 3 ) or die "Cannot construct socket - $@";

        Error: Nodename nor servname provided"

        Clearly, the above error is thrown by getaddrinfo. when I debugged further, I see the Socket library is reporting that getaddrinfo is not defined. When I studied the Socket.pm code, I found that there is a different function called "fake_getaddrinfo" which will be used in case if getaddrinfo is not defined. And going through fake_getaddrinfo code tells me that this function doesn't support IPv6 family.

        My only hope is to find out why in Perl 5.16(32 bit) the socket library reports that getaddrinfo is undefined.

        Any suggestions would help me close this issue. I also feel that this issue could only be fixed in the Socket library itself. In this case, what is the probability that the library author would be willing to fix? given that we are dealing with an older version of Perl altogether.

        A small note: I cannot really go for latest version of Perl like 5.20/5.22 since I have dependencies on other components in my environment.