Compiler Fehler



  • Hallo, ich habe mal dieses Programm geschrieben:

    #include <iostream.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <unistd.h>
    
    int main()
    {
    
    int s;
    struct sockaddr_in addr;
    s=socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(80);
    addr.sin_family = AF_INET;
    
    if (bind(s, &addr, sizeof(addr)) == -1)
    {
    	perror("bind() failed");
    	return 2;
    }
    
    if (listen(s, 3) == -1)
    {
    	perror("listen () failed");
    	return 3;
    }
    
    int close(int s);
    }
    

    und dann brachte mein Compiler (g++) diese Meldung:

    server.cpp: In function ‘int main()’:
    server.cpp:22: error: cannot convert ‘sockaddr_in*’ to ‘const sockaddr*’ for argument ‘2’ to ‘int bind(int, const sockaddr*, socklen_t)’

    Doch leider weiß ich nicht was das bedeuten soll und was nun mein Fehler ist. Könnt ihr mir da weiterhelfen?

    Vielen Dank schonmal für eure Antworten.



  • Da steht doch genau, wo der Fehler liegt. Du hast ein sockaddr_in -Objekt und übergibst das einer Funktion, die ein sockaddr erwartert.

    (zur Fehlerbehebung mußt du jemanden fragen, der sich besser mit der Socket-Programmierung auskennt)



  • Ist in diesem Fall (fast zu) einfach: Du musst den Zeiger nach (const sockaddr*) casten. Anhand der Family (die in allen sockaddr_* Strukturen an derselben Stelle steht), erkennt die Funktion bind dann, dass Du in Wirklichkeit ein sockaddr_in* übergeben hast.



  • Vielen Dank. Kannst du denn den Code so hinschreiben wie er richtig aussehen muss?
    Wäre mir eine große Hilfe.



  • Was ist denn an diesem Satz zu schwer umzusetzen?

    LordJaxom schrieb:

    Ist in diesem Fall (fast zu) einfach: Du musst den Zeiger nach (const sockaddr*) casten.

    "Casten" bedeutet einfach eine explizit angegebene Typumwandlung:

    bind(s, (sockaddr*)&addr, sizeof(addr))
    //oder
    bind(s,static_cast<sockaddr*>(&addr),sizeof(addr))
    


  • Bin halt bisschen noch ein C++ noob. Trotzdem Danke.


Log in to reply