IP Adresse aus struct sockaddr als Char anzeigen



  • Servus Leute

    In meinem C(++) Programm unter Linux (Raspberry pi Wheezy) habe ich libmicrohttpd eingebunden um über Brauser ein Interface (einfache dyn. HTML-Seiten anzeigen) zu erhalten. Ich möchte die anfragende Client IP-Adresse nutzen um davon abhängig die Seiten aufzubauen.
    Dazu gibt es in libmicrohttpd eine Funktion.
    Dies hier habe ich dazu gefunden.

    /**
    * Obtain IP address of the client. Takes no extra arguments.
    * Returns essentially a `struct sockaddr **` (since the API returns
    * a `union MHD_ConnectionInfo *` and that union contains a struct \* sockaddr *).
    * @ingroup request
    */
    MHD_CONNECTION_INFO_CLIENT_ADDRESS,

    Code-Versuch um die Funktion zu nutzen ist.

    struct sockaddr *ip;
    	ip = MHD_get_connection_info(connection, MHD_CONNECTION_INFO_CLIENT_ADDRESS)->client_addr;
    
    	char str[20];
    
    	// prüfe sockaddr family für Abfrage auf IPv4 oder IPv6 - Ausgabe der IP
    	if (ip->sa_family == AF_INET) {
    		struct sockaddr_in *v4 = (struct sockaddr_in *)ip;
    		printf("%s ", inet_ntop(AF_INET, &(v4->sin_addr), str, 20));
    	}
    
    	if (ip->sa_family == AF_INET6) {
    		struct sockaddr_in6 *v6 = (struct sockaddr_in6 *)ip;
    		printf("%s ", inet_ntop(AF_INET6, &(v6->sin6_addr), str, 20));
    	}
    

    Fehlermeldung beim kompilieren in den zwei printf Zeilen mit
    "dereferencing pointer to incomplete type"
    Ich würde gerne eine Ausgabe erhalten mit z.B."192.168.0.8".
    Bitte um eure Unterstützung da ich hier auch nach vielem Googlen nicht weiter komme.
    Vielen Dank



  • Hm, ich sehe da grade keinen Fehler...
    Vergessen den header der die structs definiert einzubinden ?

    Ansonsten zeig mal ein minimales Beispiel das bis auf den Fehler kompiliert und die komplette Fehlermeldung, inklusive Zeilennummer und allem.



  • Asche über mein Haupt. 😡
    Es fehlte...

    #include <netinet/in.h>
    

    Und schon geht’s ohne Fehler.
    Meine Interpretation der Fehlermeldung hat mich in die irre geleitet.
    Hätte hier wohl noch Tage gesucht.
    Daher vielen Dank das du meinen "Noob" Fehler so schnell aufgedeckt hast.



  • schau dir die funktion getnameinfo an, die is viel universeller. da brauchste keine unterscheidung für die protokolle machen.



  • Danke für den Tipp. Schau ich mir an.


Log in to reply