sockets probs mit accept()



  • rüdiger schrieb:

    Der Cast ist ja auch an der falschen Stelle!

    Nein ist er nicht, ich habe mein Programm nur etwas erweitert und deshalb zeigt er auch Zeile 47 an! 😉



  • Schau dir doch mal die Parameter von man: accept(2) an und dann entscheide welchen Parameter zu casten musst. Es ist sicher nicht der letzte.

    Ein Blick in ein C Tutorial wäre sicher gut für dich.



  • Ich finds nicht raus... könntest du mir pls den code erklären, bzw. was ich jetzt wie mahcen muss und mir eventuell auch ein C++ tutorial / C tutorial empfehlen?

    Danke



  • Ich hab ja gemerkt, dsas ich das 2te Argument casten muss
    Versucht hab ichs dann so:

    c = accept(s, (sockaddr*) &cli, &cli_size);

    Was mir eben nur einen Fehler mehr gab...



  • Hier mal den ganzen Code, meiner Meinung nach habe ich richtig gecastet, aber ich bekomme dennoch Fehler!

    #include <iostream.h>
    #include <stdlib.h>
    #include <sys/select.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    int main(int argc, char *argv[])
    {
        int s, c, cli_size;
        struct sockaddr_in srv, cli_addr;
    
        if (argc != 2)
        {
            fprintf(stderr, "usage: %s port\n", argv[0]);
            return 1;
        }
    
        s = socket(AF_INET, SOCK_STREAM, 0);
        if (s == -1)
        {
            perror("socket() failed");
            return 2;
        }
    
        srv.sin_addr.s_addr = INADDR_ANY;
        srv.sin_port = htons( (unsigned short int) atol(argv[1]));
        srv.sin_family = AF_INET;
    
        /*if (bind(s, &srv, sizeof(srv)) == -1)
        {
            perror("bind() failed");
            return 3;
        }*/
    
        if (listen(s, 3) == -1)
        {
            perror("listen() failed");
            return 4;
        }
    
        for(;;)
        {
            cli_size = sizeof(cli_addr);
    
            c = accept(s, (struct sockaddr *) &cli_addr, &cli_size);
    
            if (c == -1)
            {
                perror("accept() failed");
                return 5;
            }
    }
    }
    

    server2.cpp: In function »int main(int, char**)«:
    server2.cpp:48: Fehler: ungültige Umwandlung von »int*« in »socklen_t*«
    server2.cpp:48: Fehler: Argument 3 von »int accept(int, sockaddr*, socklen_t*)« wird initialisiert



  • Ei der daus. Jetzt meckert er ja über Argument 3. Vielleicht solltest du dir angucken welchen Typ er da erwartet (und nein es ist kein int!)



  • Könntest du mir nicht einfach die Lösung posten, denn ich habe ein ähnliches Script, welches die accept Funktion GENAU GLEICH hat und mit gcc prima funktioniert!



  • ähmverwirrt schrieb:

    Könntest du mir nicht einfach die Lösung posten, denn ich habe ein ähnliches Script, welches die accept Funktion GENAU GLEICH hat und mit gcc prima funktioniert!

    das bezweifel ich - deine variable cli_size ist einfach vom falschen typ, was man aber auch sehr schön an der fehlermeldung erkennt. schau einfach mal in die API was für ein variablentyp erwartet wird.

    mfg blan



  • okay hat geklappt.
    wie sieht es eigentlich mit dem bind aus da bekomm i9ch auch den fehler:

    server2.cpp:35: Fehler: »sockaddr_in*« kann nicht nach »const sockaddr*« für Argument »2« nach »int bind(int, const sockaddr*, socklen_t)« umgewandelt werden

    Und das manual sagt mir auch nicht wirklich viel..

    bind(int s, const struct sockaddr *name, socklen_t namelen);

    ähm ja... :S



  • dabei handelt es sich wieder um ein cast-problem - ein blick in die API und das vergleichen der datentypen sollte es dir klarmachen.

    mfg blan


Anmelden zum Antworten