TCP Server no matching fuction for call - Error



  • Servus,

    ich bin gerade dabei einen TCP Server zu erstellen unter Linux um diesen auf einen Server laufen zu lassen.

    jetzt wollte ich den Code erstmal Testen aber ich bekomme immer folgende Fehlermeldungen/Hinweise von meinem g++ compiler

    server.cpp: In function ‘int main()’:
    server.cpp:31:78: warning: the address of ‘int bind(int, const sockaddr*, socklen_t)’ will always evaluate as ‘true’ [-Waddress]
    std::cout << "Es konnte keine Adresse hergestellt werden! Fehlercode: " << bind << std::endl;
    ^
    server.cpp:38:83: warning: the address of ‘int listen(int, int)’ will always evaluate as ‘true’ [-Waddress]
    std::cout << "Es konnte keine Warteschlange hergestellt werden! Fehlercode: " << listen << std::endl;
    ^
    server.cpp:49:44: error: no matching function for call to ‘sockaddr_in::sockaddr_in(sockaddr_in*)’
    sock2 = accept(sock, (struct sockaddr_in)&server, &len);
    ^
    In file included from server.cpp:5:0:
    /usr/include/netinet/in.h:239:8: note: candidate: sockaddr_in::sockaddr_in()
    struct sockaddr_in
    ^
    /usr/include/netinet/in.h:239:8: note: candidate expects 0 arguments, 1 provided
    /usr/include/netinet/in.h:239:8: note: candidate: sockaddr_in::sockaddr_in(const sockaddr_in&)
    /usr/include/netinet/in.h:239:8: note: no known conversion for argument 1 from ‘sockaddr_in*’ to ‘const sockaddr_in&’

    und der Code dazu:

    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <iostream>
    
    int main(){
    
    std::cout << "Server wird gestartet.... " << std::endl;
    
    std::cout << "Socket wird erstellt..." << std::endl;
    int sock = socket(AF_INET, SOCK_STREAM, 0), sock2;
    if(sock < 0){
            std::cout << "Socket konnte nicht erstell werden! Fehlercode " << sock << std::endl;
            return 1;
            }else{
            std::cout << "Socket wurde erfolgreich erstellt!" << std::endl;
            }
    std::cout << "Eine Adresse wird erstellt ..." << std::endl;
    
    struct sockaddr_in server;
    memset( &server, 0 ,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(4000);
    
    if(bind( sock, (struct sockaddr*)&server, sizeof( server)) < 0){
            std::cout << "Es konnte keine Adresse hergestellt  werden! Fehlercode: " << bind << std::endl;
            }else{
            std::cout << "Eine Adresse wurde erfolgreich hergestellt!" << std::endl;
            }
    
    std::cout << "Warteschlange wird erstellt..." << std::endl;
    if( listen( sock, 40) == -1){
            std::cout << "Es konnte keine Warteschlange hergestellt werden! Fehlercode: " << listen << std::endl;
            return 1;
            }else{
            std::cout << "Es wurde eine Warteschlange erstellt!" << std::endl;
    }
    
    socklen_t len;
    
    while(true) //dauerschleife für server
    {
            len = sizeof(server);
            sock2 = accept(sock, (struct sockaddr_in)&server, &len);
    if(sock2 < 0){
            std::cout << "Es ist ein Fehler bei der Akzeptans von Verbindungen aufgetaucht!" << std::endl;
            return 1; 
    }
    
    }
    }
    

    aber ich finde leider den Fehler nirgends....

    PS: Ja ich weiß, dass ich noch erweiterte Fehlermeldungen einarbeiten muss 😉



  • Was erwartest du dir bei

    std::cout << ::bind;
    

    Das gibt dir lediglich den Funktionspointer von ::bind().

    Und für die Fehlermeldungen: Benutze strerror(errno)
    Das selbe gilt für listen() .

    Und bei accept() hast du vergessen zu einem Pointer zu casten.

    Lauter Fehler, die du auch selber hättest finden können.
    Sehr enttäuschend.



  • 5475674576 schrieb:

    Was erwartest du dir bei

    Und bei accept() hast du vergessen zu einem Pointer zu casten.

    okay danke, das war die Lösung 😉 und bei den anderen Kommentare... lies dir mal bitte mein Post komplett... mit dem PS: bitte


Anmelden zum Antworten