Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

Answer: How do I get the local internet IP address?

by betterworld (Curate)
on Aug 14, 2008 at 14:57 UTC ( #704362=categorized answer: print w/replies, xml ) Need Help??

Q&A > network programming > How do I get the local internet IP address? - Answer contributed by betterworld

This is probably the least portable version because it uses Linux-specific data structures, but for the fun of it and for completeness, I'll post it:

#!/usr/bin/perl use strict; use warnings; require 'sys/'; use Socket; my %interfaces; my $max_addrs = 30; socket(my $socket, AF_INET, SOCK_DGRAM, 0) or die "socket: $!"; { my $ifreqpack = 'a16a16'; my $buf = pack($ifreqpack, '', '') x $max_addrs; my $ifconf = pack('iP', length($buf), $buf); # This does the actual work ioctl($socket, SIOCGIFCONF(), $ifconf) or die "ioctl: $!"; my $len = unpack('iP', $ifconf); substr($buf, $len) = ''; %interfaces = unpack("($ifreqpack)*", $buf); unless (keys(%interfaces) < $max_addrs) { # Buffer was too small $max_addrs += 10; redo; } } for my $addr (values %interfaces) { $addr = inet_ntoa((sockaddr_in($addr))[1]); } use Data::Dumper; print Dumper \%interfaces;

The output is:

$VAR1 = { 'eth0:1' => '', 'eth0' => 'x.y.z.128', 'eth0:3' => '', 'eth0:4' => '', 'eth0:2' => 'x.y.z.62', 'lo' => '' };

(I've stripped the public addresses.)

I've successfully tested it on Debian etch and sarge.

Replies are listed 'Best First'.
Re: Answer: How do I get the local internet IP address?
by Krambambuli (Curate) on Aug 15, 2008 at 09:02 UTC
    Works OK on Fedora 8 too.

Log In?

What's my password?
Create A New User
and one hand claps...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2017-12-12 04:49 GMT
Find Nodes?
    Voting Booth?
    What programming language do you hate the most?

    Results (325 votes). Check out past polls.