man IO::Interface () - Perl extension for access to network card configuration information


IO::Interface - Perl extension for access to network card configuration information


  use IO::Socket;
  use IO::Interface qw(:flags);

  my $s = IO::Socket::INET->new(Proto => 'udp');
  my @interfaces = $s->if_list;

  for my $if (@interfaces) {
    print "interface = $if\n";
    my $flags = $s->if_flags($if);
    print "addr =      ",$s->if_addr($if),"\n",
          "broadcast = ",$s->if_broadcast($if),"\n",
          "netmask =   ",$s->if_netmask($if),"\n",
          "dstaddr =   ",$s->if_dstaddr($if),"\n",
          "hwaddr =    ",$s->if_hwaddr($if),"\n";

    print "is running\n"     if $flags & IFF_RUNNING;
    print "is broadcast\n"   if $flags & IFF_BROADCAST;
    print "is p-to-p\n"      if $flags & IFF_POINTOPOINT;
    print "is loopback\n"    if $flags & IFF_LOOPBACK;
    print "is promiscuous\n" if $flags & IFF_PROMISC;
    print "is multicast\n"   if $flags & IFF_MULTICAST;
    print "is notrailers\n"  if $flags & IFF_NOTRAILERS;
    print "is noarp\n"       if $flags & IFF_NOARP;

  my $interface = $s->addr_to_interface('');


IO::Interface adds methods to IO::Socket objects that allows them to be used to retrieve and change information about the network interfaces on your system. In addition to the object-oriented access methods, you can use a function-oriented style.

Creating a Socket to Access Interface Information

You must create a socket before you can access interface information. The socket does not have to be connected to a remote site, or even used for communication. The simplest procedure is to create a UDP protocol socket:

  my $s = IO::Socket::INET->new(Proto => 'udp');

The various IO::Interface functions will now be available as methods on this socket.


The if_list() method will return a list of active interface names, for example eth0 or tu0. If no interfaces are configured and running, returns an empty list. if_addr() gets or sets the interface address. Call with the interface name to retrieve the address (in dotted decimal format). Call with a new address to set the interface. In the latter case, the routine will return a true value if the operation was successful.

  my $oldaddr = $s->if_addr('eth0');
  $s->if_addr('eth0','') || die "couldn't set address: $!";
Special case: the address of the pseudo-device any will return the IP address, which corresponds to the INADDR_ANY constant. Get or set the interface broadcast address. If the interface does not have a broadcast address, returns undef. Get or set the interface netmask. Get or set the destination address for point-to-point interfaces. Get or set the hardware address for the interface. Currently only ethernet addresses in the form 00:60:2D:2D:51:70 are accepted. Get or set the flags for the interface. The flags are a bitmask formed from a series of constants. See Exportable constants below. Given an interface address in dotted form, returns the name of the interface associated with it. Special case: the INADDR_ANY address, will return a pseudo-interface name of any.


IO::Interface exports nothing by default. However, you can import the following symbol groups into your namespace:

  :functions   Function-oriented interface (see below)
  :flags       Flag constants (see below)
  :all         All of the above

Function-Oriented Interface

By importing the :functions set, you can access IO::Interface in a function-oriented manner. This imports all the methods described above into your namespace. Example:

  use IO::Socket;
  use IO::Interface ':functions';

  my $sock = IO::Socket::INET->new(Proto=>'udp');
  my @interfaces = if_list($sock);
  print "address = ",if_addr($sock,$interfaces[0]);

Exportable constants

The :flags constant imports the following constants for use with the flags returned by if_flags():


This example determines whether interface 'tu0' supports multicasting:

  use IO::Socket;
  use IO::Interface ':flags';
  my $sock = IO::Socket::INET->new(Proto=>'udp');
  print "can multicast!\n" if $sock->if_flags & IFF_MULTICAST.


Lincoln Stein <>

This module is distributed under the same license as Perl itself.