Problem mit Server [gelöst]



  • Hallo. Also mich plagt ein Problem, dem ich nicht auf die Schliche kommen konnte. Mein Server hat eine Endlosschleife, die aber ihren Dienst nicht tut. Woran liegt das? (Das C im C++ Code sei bitte außer Acht gelassen)

    #include <iostream>
    #include <winsock.h>
    
    #define BUFFER_SIZE 1024
    
    using namespace std;
    
    int handling(int c)
    {
    char buffer[BUFFER_SIZE], name[BUFFER_SIZE];
    int bytes;
    strcpy(buffer, "My name is: ");
    bytes = send(c, buffer, strlen(buffer), 0);
    if (bytes == -1)
    return -1;
    bytes = recv(c, name, sizeof(name), 0);
    if (bytes == -1)
    return -1;
    name[bytes] = '\0';
    sprintf(buffer, "Hello %s, nice to meet you!\r\n", name);
    bytes = send(c, buffer, strlen(buffer), 0);
    if (bytes == -1)
    return -1;
    return 0;
    }
    int main(int argc, char *argv[])
    {
    		    /* initialize windows sockets */
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(1, 1), &wsa))
        {
            cout << "WSAStartup() failed: " << (unsigned long)GetLastError() << endl;
            return EXIT_FAILURE;
        }
    int s, c, cli_size;
    struct sockaddr_in srv, cli;
    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, (struct sockaddr*)&srv, sizeof(srv)) == -1)
    {
    perror("bind() failed");
    return 3;
    }
    if (listen(s, 3) == -1)
    {
    perror("listen() failed");
    return 4;
    }
    for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT AB
    {
    c = accept(s, (struct sockaddr*)&cli, &cli_size);
    if (c == -1)
    {
    perror("accept() failed");
    return 5;
    }
    printf("client from %s", inet_ntoa(cli.sin_addr));
    if (handling(c) == -1)
    fprintf(stderr, "%s: handling() failed", argv[0]);
    /* hier empfiehlt sich kein return mehr, weil sonst der
    * ganze Server beendet wird wenn ein Client wegstirbt. Das ist
    * natürlich nicht sinnvoll.
    */
    closesocket(c);
    }
    return 0;
    }
    


  • Warum nicht einfach

    while(true)
    	{ 
    		c = accept(s, (struct sockaddr*)&cli, &cli_size); 
    		if (c == -1) 
    		{ 
    			perror("accept() failed"); 
    			return 5; 
    		} 
    		printf("client from %s", inet_ntoa(cli.sin_addr)); 
    		if (handling(c) == -1) 
    			fprintf(stderr, "%s: handling() failed", argv[0]); 
    		/* hier empfiehlt sich kein return mehr, weil sonst der 
    		* ganze Server beendet wird wenn ein Client wegstirbt. Das ist 
    		* natürlich nicht sinnvoll. 
    		*/ 
    		closesocket(c); 
    	}
    

    Gruß eXitus



  • eXitus schrieb:

    Warum nicht einfach

    while(true)
    	{ 
    		c = accept(s, (struct sockaddr*)&cli, &cli_size); 
    		if (c == -1) 
    		{ 
    			perror("accept() failed"); 
    			return 5; 
    		} 
    		printf("client from %s", inet_ntoa(cli.sin_addr)); 
    		if (handling(c) == -1) 
    			fprintf(stderr, "%s: handling() failed", argv[0]); 
    		/* hier empfiehlt sich kein return mehr, weil sonst der 
    		* ganze Server beendet wird wenn ein Client wegstirbt. Das ist 
    		* natürlich nicht sinnvoll. 
    		*/ 
    		closesocket(c); 
    	}
    

    Gruß eXitus

    Die Lösung geht leider auch nicht... 🙄



  • 1. Problem beschreiben
    2. Codestelle raussuchen
    3. Welche Endlosschleife?



  • Du hast cli_size nicht initialisiert:

    cli_size = sizeof(SOCKADDR_IN);
    


  • BBBB schrieb:

    Du hast cli_size nicht initialisiert:

    cli_size = sizeof(SOCKADDR_IN);
    

    Stimmt, aber die Schleife bricht trotzdem sofort ab. Sowas habe ich noch nie erlebt, naja... Hier nochmal der Codeblock:

    for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT AB
    {
    c = accept(s, (struct sockaddr*)&cli, &cli_size);
    if (c == -1)
    {
    perror("accept() failed");
    return 5;
    }
    printf("client from %s", inet_ntoa(cli.sin_addr));
    if (handling(c) == -1)
    fprintf(stderr, "%s: handling() failed", argv[0]);
    closesocket(c);
    }
    return 0;
    }
    


  • skullyan schrieb:

    for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT AB
    

    WO bricht es ab? bist du mal mit dem Debugger schrittweise durchgegangen?



  • pumuckl schrieb:

    skullyan schrieb:

    for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT AB
    

    WO bricht es ab? bist du mal mit dem Debugger schrittweise durchgegangen?

    Ja, hier:

    if (argc != 2)
    {
    fprintf(stderr, "usage: %s port\n", argv[0]);
    return 1;
    }
    

    Nachdem ich fprintf mit einer C++ Instanz ( cout ) ersetzt habe, trat der fehler nicht mehr auf.. Komisch... Liegt das vielleicht daran, dass ich kein stdio.h inkludiert hatte? Und wenn ja, wieso ließ sich das Programm überhaupt kompilieren?

    EDIT: Wie ich eben festgestellt habe, lag es daran, dass stdio.h nicht inkludiert war. Mich wundert nur, dass der Compiler da nicht meckert... Gelöst.


Anmelden zum Antworten