Prob mit gethostbyaddr() - Linux - gcc



  • Habe ein mächtiges Problem mit der Funktion gethostbyaddr() (IP->Hostname). Diese Funktion brauche ich für mein Testprogramm tcpdump (gut für den Einstieg in die Socket-Programmierung). Soweit läuft das Prog einwandfrei. Jedoch möchte ich die Source-IP, die dort angezeigt wird in einen Hostnamen über DNS umwandeln.

    Um die Fktion gethostaddr() ertsmal zu testen habe ich ein kleines Prog geschrieben (siehe unten). Weiterhin habe ich die manpages durchgelesen und anderen Quellcode studiert.

    Das Testprogramm für diese Fkt.:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
        struct hostent *host;
    
        if(argc != 2)
        {
    	fprintf(stderr, "usage: %s <ip>\n", argv[0]);
    	return 1;
        }
    
        if((host = gethostbyaddr(argv[1], strlen(argv[1]), AF_INET)) == NULL)
        {
    	herror("Error");
    	return 2;
        }
    
        printf("Host: %s", host->h_name);
        return 0;
    }
    

    gethostbyaddr() gibt IMMER einen NULL-Pointer zurück, egal welche IP man eingibt. Ich habe sogar spaßenshalber mal eine IP ohne Punkte eingegeben. gethostbyname() funktioniert einwandfrei.
    Die Fkt. herror() gibt immer den Fehler "host unknown" aus....
    Entweder bin ich blind, oder die Fkt. ist ein Fake. 😉



  • axo: Das Prog habe ich mit "gcc -Wall prog.c -o prog" kompiliert.



  • Dieser Thread wurde von Moderator/in Shade Of Mine aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • so, darauf hab ich noch gewartet 😉

    die ersten zwei paramenter von gethostbyaddr sind falsch.

    du willst ein struct in_addr erzeugen. anschliessend
    inet_addr auf dein argv[1] anwenden und das ganze
    dann in in_addr.s_addr schreiben. danach nochmal die
    angesprochenen parameter überdenken.

    .. und vielleicht nochmal bissel lesen 🙄

    gruß
    stahl



  • Meinst du die Version?

    ip = (struct iphdr*) buffer;
        tcp = (struct tcphdr*) (buffer + sizeof(struct iphdr*));
    
        while ((bytes = recv(raw_socket, buffer, sizeof(buffer), 0)) > 0)
        {
    	addr.sin_addr.s_addr = ip->saddr;
    	printf("\nSourceIP: %s:%i", inet_ntoa(addr.sin_addr), ntohs(tcp->source));
    
    	if((host = gethostbyaddr((char*)(&addr.sin_addr), sizeof(addr.sin_addr), AF_INET)) == NULL)
    	{
    		herror("Error");
    	}
    	else
    	{
    		printf(" %s\n", host->h_name);
    	}
    


  • nein?!

    struct in_addr in;
          in.s_addr = inet_addr(argv[1]);
          gethostbyaddr(&in,sizeof(struct in_addr),AN_INET);
    


  • #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
        struct hostent *host;
        struct in_addr in;
    
        if(argc != 2)
        {
    	fprintf(stderr, "usage: %s <ip>\n", argv[0]);
    	return 1;
        }
    
        in.s_addr = inet_addr(argv[1]);
    
        if((host = gethostbyaddr(&in, sizeof(struct in_addr), AF_INET)) == NULL)
        {
    	herror("Error");
    	return 2;
        }
    
        printf("Host: %s", host->h_name);
        return 0;
    }
    

    Ich habe mal deinen Vorschlag in das obige Listing eingebaut. Allerdings kommt immer noch die selbe Fehlermeldung.
    Die anderen 2 Varianten (nur die Fkt. gethostbyaddr betreffend), die ich probiert habe (siehe meine vorherigen Postings) sind aus dem Inet.
    Beide Varianten sind für Linux und gcc.



  • das funktinoiert.
    achte halt auf folgendes:
    nicht für jede ip-adresse ist ein "reverse-lookup" definiert.



  • ok, alles klar. Es funzt (Deine Ver. und die 2. Ver. von mir). Ich war warsch. zu schnell mit dem probieren.
    thx. 😃


Anmelden zum Antworten