Sundararajan
Sundararajan

Reputation: 704

Python socket gethostbyname() returns only one IP address

I'm doing some simple experiments using Python socket, where I've a HOSTNAME which resolves with two IP addresses but when I use,

socket.gethostbyname('demo.sample.com')

I'm getting only one IP address. Why is it showing that way? Is there any other way I can get multiple IP addresses?

EDIT - 1

I got it guys, instead of gethostbyname('demo.sample.com')
I tried gethostbyname_ex('demo.sample.com')
It gives the result as I expected.

Upvotes: 6

Views: 11789

Answers (2)

Alex44
Alex44

Reputation: 3855

I found a solution here, which returns the internal network IP:

import socket


def ip_addr(hostIP=None):
    if hostIP is None or hostIP == 'auto':
        hostIP = 'ip'

    if hostIP == 'dns':
        hostIP = socket.getfqdn()
    elif hostIP == 'ip':
        from socket import gaierror
        try:
            hostIP = socket.gethostbyname(socket.getfqdn())
        except gaierror:
            logger.warn('gethostbyname(socket.getfqdn()) failed... trying on hostname()')
            hostIP = socket.gethostbyname(socket.gethostname())
        if hostIP.startswith("127."):
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            # doesn't have to be reachable
            s.connect(('10.255.255.255', 1))
            hostIP = s.getsockname()[0]
    return hostIP


if __name__ == '__main__':
    print('%s' % ip_addr())

Upvotes: 2

Steffen Ullrich
Steffen Ullrich

Reputation: 123561

From the documentation it is visible that:

  • gethostbyname returns only a single IPv4 address. And to cite:
    See gethostbyname_ex() for a more complete interface.
  • gethostbyname_ex will return multiple IPv4 address, but check out the usage. And to cite:
    gethostbyname_ex() does not support IPv6 name resolution, and getaddrinfo() should be used instead for IPv4/v6 dual stack support.
  • getaddrinfo will return all IPv4 and IPv6 addresses, but check out the usage.

Upvotes: 11

Related Questions