Seite 1 von 1

socket.gethostbyname --> getaddrinfo failed

Verfasst: Mittwoch 13. Oktober 2021, 15:53
von parthica
Hallo zusammen

Schön hier zu sein, ich hoffe ich kann ein wenig profitieren von diesem Forum =)
Ich versuch mich seit ein paar Tagen in Python. Bin also noch der Vollnoob. Eigentlich bin ich im Netzwerk zuhause. Ich arbeite an einem Script, das mir Daten aus verschiedenen Quellen ausliest. Ein Teil davon ist das umwandeln von einer IP zu einem Hostname. Dazu verwende ich das modul socket. Folgender Code scheint gut zu funktionieren:

Code: Alles auswählen

print (socket.gethostbyname('eve.cardano.ch'))
Wenn ich das aber in meinen Code einbaue erhalte ich immer eine Fehlermeldung, dass er den Hostname nicht auflösen kann. Ich verstehe aber nicht wieso. Im untenstehenden Beispiel versuche ich mit x.update den value zu ändern. wenn ich x.update durch print ersetze, zeigt er mir alle key/values an inklusive den umgewandelten IP Adressen.

Code: Alles auswählen

print = [{'IP': 'none', 'HOSTNAME': 'eve.cardano.ch'}, {'IP': 'none', 'HOSTNAME': 'boot.cardano.ch'}]

def dnslookup( host_list ):
    return socket.gethostbyname(host_list)

    
## Loop um das Feld HOSTNAME zu füllen mit der oben erstellten Funktion
for x in dictList:
    x.update({'IP' : dnslookup(x['HOSTNAME'])})



print (dictList)
Fehler:
return socket.gethostbyname(host_list)
socket.gaierror: [Errno 11001] getaddrinfo failed



Kann mir da jemand weiterhelfen?
Grüsse

Re: socket.gethostbyname --> getaddrinfo failed

Verfasst: Mittwoch 13. Oktober 2021, 16:16
von __deets__
Ich bekomme da ganz andere Fehler - der Name dictList ist nicht definiert. socket auch nicht. Bitte Code posten, der auch zur Fehlermeldung oder dem falschen Verhalten passt, nicht irgend einen anderen Code.

Wenn ich den Code repariere, funktioniert er. Es muss also an etwas anderem liegen.

Re: socket.gethostbyname --> getaddrinfo failed

Verfasst: Freitag 15. Oktober 2021, 14:14
von DeaD_EyE

Code: Alles auswählen

import socket


FAILED = "LOOKUP_FAILED"


def dnslookup(host_list, adress_family=socket.AF_INET):
    results = []

    for hostname in host_list:
        try:
            # https://docs.python.org/3/library/socket.html#socket.getaddrinfo
            # https://stackabuse.com/unpacking-in-python-beyond-parallel-assignment/
            *_, (ip, *_) = socket.getaddrinfo(hostname, None, adress_family)[0]
        except socket.gaierror:
            ip = FAILED
        results.append({"hostname": hostname, "ip": ip})

    return results


print("IPv4")
domains = ["eve.cardano.ch", "boot.cardano.ch", "domain.tld", "archive.server101.icu"]
results = dnslookup(domains)
for result in results:
    print(result)


print()
print("IPv6")
domains = ["eve.cardano.ch", "boot.cardano.ch", "domain.tld", "archive.server101.icu"]
results = dnslookup(domains, socket.AF_INET6)
for result in results:
    print(result)

Dein Code funktioniert aber auch, wenn man socket importiert und die Zuweisung in der ersten Zeile von `print` nach `dictList` ändert.