client IP auslesen



  • puts (inet_ntoa(serv_addr.sin_addr));
    puts (inet_ntoa(cli_addr.sin_addr));
    

    foo->bar ist kurz für *(foo).bar



  • @Probe-Nutzer, Insider

    naja soviel das foo->bar = (*foo).bar ist weiß ich dann doch.

    leider ist mein cli_addr aber kein Zeiger, sondern nur eine Variable, weshalb

    puts (inet_ntoa(cli_addr.sin_addr));
    

    nicht funktioniert.

    gcc sagt dazu folgendes...

    $ gcc ./open_socket.c -lpthread -o ./open_socket
    ./open_socket.c: In Funktion »main«:
    ./open_socket.c:84:1: Warnung: Übergabe des Arguments 1 von »puts« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung [standardmäßig aktiviert]
    /usr/include/stdio.h:692:12: Anmerkung: »const char *« erwartet, aber Argument hat Typ »int«
    


  • Der Fehler, den gcc ausgibt, hat überhaupt nichts damit zu tun, dass cli_addr kein Zeiger ist. Zeige besser die Zeile 84, damit klar ist, was das Problem ist. Dort verwendest du offensichtlich nicht inet_ntoa (denn das gibt keine Ganzzahl zurück, wie gcc feststellt), sondern...?

    MfG,

    Probe-Nutzer



  • Zeile 84 ist

    puts (inet_ntoa(cli_addr.sin_addr));
    

    dachte das wäre aus meinem Post ersichtlich.



  • Ok, dann noch einmal ganz genau, warum ich anzweifeln musste, dass das die richtige Zeile ist (dein main oben hat z.B. auch nur 54 Zeilen) : die angegebene Zeile kann die Warnung (nicht Fehler, wie ich oben schrieb) nicht verursachen, weil inet_ntoa, wie nachzulesen ist, char* zurück gibt, und keine Ganzzahl, nicht die Übergabe von cli_addr.sin_addr an inet_ntoa ist das Problem, sondern das puts einen int bekommt, den inet_ntoa nicht als Ergebnis liefern kann. Hast du irgendwo noch etwas mit inet_ntoa stehen, hast du über main noch etwas, was das verursachen könnte?

    MfG,

    Probe-Nutzer



  • woanders im Programm wird weder inet_ntoa() noch puts benutzt, lediglich zum testen an folgender Stelle (für gesamten Codeausschnitt siehe Eröffnungspost)

    ...
       while (1)
       {
            bzero(command,255);     //initialisiere command buffer
            listen(sockfd, 5);     //int listen(int socket, int backlog) - backlog, something with the queue
            clilen = sizeof(cli_addr);  //Länge der client addresse
            newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    
    ----->  puts (inet_ntoa(cli_addr.sin_addr));
    
            read(newsockfd,command,255);
    ...
    


  • Include vergessen?



  • sähe da die Meldung von gcc nicht anders aus?
    hier die includes...

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h> 
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <pthread.h>
    


  • P!ngu schrieb:

    sähe da die Meldung von gcc nicht anders aus?

    Ich bin nicht so der C-Fachmann, aber war das im alten Standard nicht so, dass undeklarierte Funktionen als Rückgabetyp int angenommen werden? Das würde zur Fehlermeldung passen

    P!ngu schrieb:

    hier die includes...

    man inet_ntoa erwähnt noch

    #include <arpa/inet.h>



  • damit funktionierts! 🤡

    Vielen Dank MFK

    hier nochmal kurz die Zusammenfassung...

    Situation: Client hat sich bereits mit Server verbunden.
    Frage: Wie bekomme ich auf Serverseite die IP vom Client als String?
    Antwort: so...

    ...
    #include <arpa/inet.h>
    
    ...
    
    int main(int argc, char *argv[])
    {
            ...
    
            struct sockaddr_in serv_addr, cli_addr;	
    
            ...
    
    	while (1)
    	{
                    ...
    
    		listen(sockfd, 5);
    		clilen = sizeof(cli_addr);
    		newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    
    puts (inet_ntoa(cli_addr.sin_addr));
    
                    ...
    

    Vielen Dank auch an alle anderen die mir hier geholfen haben.

    Schönes Wochenende,
    Pingu 🙂


Anmelden zum Antworten