socket.gethostbyname --> getaddrinfo failed

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
parthica
User
Beiträge: 1
Registriert: Mittwoch 13. Oktober 2021, 15:38

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten