::getaddrinfo() Host-Name



  • Hallo,

    Ich lese in der Man Page dass ich zusammengefasst folgende Flags an getaddrinfo() übergeben muss um den Host Namen der IP zu ermitteln mittels getaddrinfo() zu ermitteln.

    std::memset((char*)&info, 0, sizeof(info));
    info.ai_flags = AI_CANONNAME | AI_CANONIDN | AI_IDN_ALLOW_UNASSIGNED | AI_IDN_USE_STD3_ASCII_RULES;
    
    getaddrinfo(host, service, &info, &addr);
    

    Ich muss das alles mit getaddrinfo() lösen. Ich habe schon etliche Flags in verschiedenen Kombinationen ausprobiert, was ai_cannonname betrifft, aber nichts hat funktioniret.



  • Du hast ne IP und willst den Hostname ermitteln?
    Das geht soweit ich weiß nicht mit getaddrinfo sondern nur mit getnameinfo.



  • Auch die getnameinfo() und gethostbyname() Funktionen bringen mich nicht weiter. Wenn ich eine DNS-Anfrage auf eine IP mache, kriege ich auch nur die IP im Klartext zurück, vom Host Namen keine Spur.

    Ich habe gelesen ich muss sowas wie rDNS machen. Und da die herkömmlichen unixsche C-Socket-Funktionen sowas nicht unterstützen, muss ich das DNS-Protokoll wohl selbst implementieren.

    Ist zwar kein Berg Arbeit, ist aber dann schon ziemlich Kacke, dass die nicht von Haus aus schon mehr und ausgereiftere DNS-Funktionen zur verfügung stellen.



  • oih schrieb:

    Auch die getnameinfo() und gethostbyname() Funktionen bringen mich nicht weiter. Wenn ich eine DNS-Anfrage auf eine IP mache, kriege ich auch nur die IP im Klartext zurück, vom Host Namen keine Spur.

    gethostbyname ist auch hier falsch. Im falle einer IP-Addresse als input wird einfach diese ip-addresse kopiert.
    siehe https://linux.die.net/man/3/gethostbyname

    was laut der manpage funktionieren sollte ist: gethostbyaddr



  • Niemals nie und nirgends gethostbyname und gethostbyaddr benutzten!
    Wenn dann getaddrinfo und getnameinfo.

    Die ersteren haben nämlich ihre Probleme bei IPv6 und sollten daher in aktueller Software einfach nicht mehr benutzt werde.

    Ich zitiere mal aus der man page um auf die ursprüngliche Nachricht zu antworten:

    struct sockaddr *sa;    /* input */
    socklen_t len;         /* input */
    char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
    
    if (getnameinfo(sa, len, hbuf, sizeof(hbuf), sbuf,
                sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0)
        printf("host=%s, serv=%s\n", hbuf, sbuf);
    

Log in to reply