Wieso tut das nicht?



  • Hallo zusammen,

    hab diesen quelltext abgeschrieben, von zotteljedi. Jedoch stimmt was mit der Zeile mit dem 'accept' nicht. Compilerfehler lautet:

    passing `int' to argument 3 of `accept(int, sockaddr *, socklen_t *)' lacks a cast

    Kann mir jemand sagen was ich falsch abschreibe??

    -------------------------------------------

    int s, c, remote_len, running;
    unsigned short port;
    struct in_addr addr;
    struct sockaddr_in local;
    struct sockaddr_in remote;

    remote_len = 0;

    addr.s_addr = inet_addr("127.0.0.1");
    port = SERVER_PORT;

    cout << "going to bind server to " << inet_ntoa(addr) << ": " << port << endl;

    s = socket( PF_INET, SOCK_STREAM, 0 );

    if( s == 1 )
    {
    cout << "socket failed" << endl;
    return false;
    }

    local.sin_addr = addr;
    local.sin_port = htons(port);
    local.sin_family = AF_INET;

    if( bind( s, (struct sockaddr*) &local, sizeof(local)) == -1 )
    {
    cout << "bind failed" << endl;
    return false;
    }

    if( listen( s, 3) == -1 )
    {
    cout << "listen failed" << endl;
    return false;
    }

    running = 1;
    while( running == 1 )
    {
    remote_len = sizeof(remote);
    c = accept( s, (struct sockaddr*) &remote, remote_len );

    if( c == -1 )
    {
    continue;
    }

    cout << "client from " << inet_ntoa(remote.sin_addr) << ": " << ntohs(remote.sin_port) << " arrived" << endl;

    running = handle_client(c);

    cout << "client left" << endl;

    close (c);
    }



  • schau dir doch mal an, was accept als 3tes argument erwartet, und dann schau mal, was du übergibst!



  • Erstens solltest du CPP-Tags verwenden, das erhöht die Lesbarkeit des Programms.

    Und zweitens sagt dir dein Compiler doch, was der Fehler ist: man: accept erwartet als dritten Parameter einen Pointer auf eine "socklen_t" Variable und keinen blanken int-Wert.



  • Ich weiß nicht genau was socklen_t ist aber sicher erwartet accept als 3. Parameter einen Zeiger drauf. Soll also heißen du musst auch vor den 3. Parameter ein '&' schreiben um die addresse zu übergeben.

    Ja da hat hemand vor mir gepostet. socklen_t ist bestimmt nur ein typedef auf ein unsigned irgendwas (int oder long).



  • Danke für die Antworten!

    Dacht ich hol mir da was fertiges ausm Internet, damit ich ein bisschen rumspielen kann damit und nun...

    Im Großen und Ganzen versteh ich den Code. Aber ich weiß nicht wirklich was remote und remote_len sein sollen...

    Auffallen tut mir aber dennoch das dem remote nix zugewiesen wird..

    Aber wie gesagt, ist nur abgeschrieben, weiß nicht wo der Fehler ist.

    struct sockaddr_in remote;
    remote_len = 0;
    remote_len = sizeof(remote);
    c = accept( s, (struct sockaddr*) &remote, &remote_len );

    Das & hatte ich vorhin nur vergessen.. ist aber schon drin.. und tut dennoch nicht..



  • c = accept( s, (struct sockaddr*) &remote, &remote_len );

    Wenn das '&' drin ist bekomm ich folgenden Fehler:

    passing `int *' as argument 3 of `accept(int, sockaddr *, socklen_t *)' changes signedness



  • Versuchs so:

    accept( s, (struct sockaddr*) &remote, (socklen_t*)&remote_len );
    

    oder probiere oben, anstatt:
    int remote_len;
    socklen_t remote_len;

    Weiß nicht genau was Code abschreiben bringen soll. Aber wenn's Spaß macht.



  • Dann definiere remote_len doch nicht als int - wie idexe sagte, ist das vermutlich ein unsigned Typ:

    struct sockadrr remote;
    socklen_t remote_len=sizeof(remote);
    c=accept(s,&remote,&remote_len);
    


  • Was ist denn die Fehlermeldung? (Dieselbe kann es nicht sein)

    Sinn:
    accept erwartet einen Zeiger auf socklen_t, damit er die tatsächliche Länge der beschriebenen Adresse dort ablegen kann. Da accept nicht nur für IPv4 Sockets ist, muss das nicht zwangsläufig sizeof(struct sockaddr_in) sein.



  • Danke für die Antworten! Jetzt tuts..

    Idexe, wenn nicht weist wozu Code abschreiben gut ist, dann frag doch einfach ^^

    Ich weiß z.B. nicht wozu man das Rad jeden Tag neu erfinden soll, du etwa??



  • Naja egal. Aber Codeabschreiben finde ich ist keine Alternative zum "Rad neu erfinden".



  • Hättest du das ganze neu geschrieben, obwohl es im Interent fertige Vorlagen gibt??

    Ich brauch eine kleine Client-Server-Anwendung, hab das ganze schon vor langer Zeit mal für was anderes gebraucht, jedoch jetzt nicht mehr gefunden.

    Mein Lösungsvorschlag, Vorlage aus dem I-Net kopieren.

    Und jetzt sag bloß du hättest einen anderen Vorschlag. *lol*


Anmelden zum Antworten