Get the ipv6 address from a interface

Roy Smith roy at panix.com
Thu Apr 9 08:17:29 EDT 2009


In article 
<86176ef7-c2e0-4c5d-b883-d91672e3eb0b at w40g2000yqd.googlegroups.com>,
 Kai Timmer <email at kait.de> wrote:

> Hello,
> i need a function that returns the ipv6 address from a given interface
> name. For ipv4 i use this one:
> def get_ip_address(ifname):
>   s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>   return socket.inet_ntoa(fcntl.ioctl(
>       s.fileno(),
>       0x8915,  # SIOCGIFADDR
>       struct.pack('256s', ifname[:15])
>   )[20:24])
> 
> which works great. But i am not enough into python to port that to
> ipv6. It has to work under linux only. Any help is appreciated.

I'm not 100% sure what you're trying to do, but the above is horribly 
non-portable.  You probably want to be looking at socket.getpeername() and 
socket.getsockname().

In general, concepts like "the address of an interface" are difficult.  In 
many OS's, a given interface may have multiple addresses.  This is 
especially true in IPv6 where you've have both link local and global 
unicast addresses on the same interface.

Can you back up a few steps and describe what it is that you're trying to 
do, i.e. the use case?



More information about the Python-list mailing list