Programm springt aus Schleife und ich versteh nicht warum (oder wie!)



  • Hallo,

    Ich habe hier einen kleinen Server der für nichts da ist außer Kommandos im Format 2 Byte Kommando-ID, 7 Byte Parameter-Länge, (Parameter-Länge) Byte Parameter zu empfangen. Dafür hab ich eine Schleife die auf einen Client wartet, wenn einer angenommen wurde in eine weitere Schleife geht, dort erst 2 Byte Kommando, dann 7 Byte Parameter-Länge und dann X Byte in einer Schleife Parameter empfägt. ich weiß nicht was ich geändert habe, aber immmer wenn was vom Client geschickt wurde Springt der Server aus der Empfangs-Schleife und wartet wieder erneut auf einen Client. Das komische ist dass ich überall wo ich einen break zum herausspringen aus der Schleife einbegaut habe auch eine Ausgabe hab, aber er nichts anderes ausgibt als

    Closing connection
    Server ready, waiting for requests

    Sorry dass der Code so lang ist...

    for (;;)
    {
    	printf("Server ready, waiting for requests\n\n");
    
    	// Auf einen eingehende Verbindungen warten
    	len = sizeof(client);
    	fd = accept(sock, (struct sockaddr*)&client, &len);
    	if (fd < 0) {
    		printf("Error accepting\n");
    	}
    
    	printf("A client connected!\n\n");
    
    	for (;;) 
    	{
    		// 2 Byte Kommando empfangen
    		if((rc = recv(fd,command_buffer_s,2,0)) < 0)
    			printf("Command: Error while recieving\n");
    			break;
    		if(rc==0) {
    			printf("Command: Client has closed the connection\n");
    			break;
    		}
    
    		command_buffer_s[2]='\0';
    		printf("Command-buffer: %s\n", command_buffer_s);
    
    		// Parameter-Länge empfangen
    		if((rc = recv(fd,data_length_s,7,0)) < 0)
    			printf("Data-length: Error while recieving\n");
    			break;
    		if(rc==0) {
    			printf("Data-length: Client has closed the connection\n");
    			break;
    		}
    
    		data_length_s[7]='\0';
    		printf("Data-length: %s\n", data_length_s);
    		data_length_i = atoi(data_length_s);
    
    		// Speicher für Parameter reservieren
    		rec_buffer = realloc(rec_buffer, data_length_i);
    		rec_data = realloc(rec_data, data_length_i);
    
    		sprintf(rec_data, "");
    
    		// So lange Daten empfangen bis die Daten-länge erreicht ist und in rec_data speichern
    		while(data_rc !=0 && data_length_i > 0)
    		{
    			printf("In the data-recieving-loop!");
    
    			if((data_rc = recv(fd,rec_buffer,data_length_i,0)) < 0)
    				printf("Data: Error while recieving\n");
    				winamp_disconnected = 1;
    				break;
    			if(data_rc==0) {
    				printf("Data: Client has closed the connection\n");
    				winamp_disconnected = 1;
    				break;
    			}
    
    			rec_buffer[data_rc]='\0';
    			printf("%s\n", rec_buffer);
    			strcat(rec_data, rec_buffer);
    			loop_count++;
    
    			data_length_i = data_length_i - data_rc;
    		}
    
    		// Springt aus der Schleife wenn beim empfangen von den Parametern ein Fehler
    		// aufgetaucht ist oder der Client die Verbindung beendet hat
    		if(winamp_disconnected == 1) {
    			printf("Disconnect through 'winamp_disconnected==1'");
    			winamp_disconnected = 0;
    			break;
    		}
    
    		if(loop_count>1)
    			printf("loop used %d times!\n", loop_count);
    		loop_count = 0;
    
    		printf("rec_data: %s\n", rec_data);
    	}
    
    	printf("Closing connection\n");
    	close(fd);
    
    	winamp_is_connected = 0;
    }
    

    Wie gesagt, keine Ausgabe außer

    Closing connection
    Server ready, waiting for requests

    wenn daten gesendet werden, und das obwohl bei jedem break eigentlich ne Ausgabe ist... .

    Echt kein Plan

    Luke



  • Debugger.



  • if (fd < 0) {
    

    Die öffnende Klammer in der gleichen Zeile wie das if waren mir schon immer suspekt. Schau Dir deine if-Konstrukte mal genauer an.

    Welcher Compiler? Ich würde den immer auf die höchste Warnstufe stellen.



  • Der Server gibt nicht mal "A client connected!" aus ?

    for (;;)
    {
    ...
     for (;;) 
     {
      // 2 Byte Kommando empfangen
      if((rc = recv(fd,command_buffer_s,2,0)) < 0)
       printf("Command: Error while recieving\n");
       break;                                     // <- springt auf jeden Fall aus der inneren for-Schleife
    ...
      if((rc = recv(fd,data_length_s,7,0)) < 0)
       printf("Data-length: Error while recieving\n");
       break;                                     // <- hier auch !
    ... 
     }
    ...
    }
    

    keksekekse schrieb:

    Schau Dir deine if-Konstrukte mal genauer an.

    🙂



  • merker schrieb:

    Der Server gibt nicht mal "A client connected!" aus ?

    Doch, das sagt er am Anfang ein mal wenn der Client verbindet, aber wenn ich vom Client ein Kommando schicke sagt er nichts außer dem oben genannten, keine Message von wo aus er aus der Schleife springt.

    merker schrieb:

    for (;;)
    {
    ...
     for (;;) 
     {
      // 2 Byte Kommando empfangen
      if((rc = recv(fd,command_buffer_s,2,0)) < 0)
       printf("Command: Error while recieving\n");
       break;                                     // <- springt auf jeden Fall aus der inneren for-Schleife
    ...
      if((rc = recv(fd,data_length_s,7,0)) < 0)
       printf("Data-length: Error while recieving\n");
       break;                                     // <- hier auch !
    ... 
     }
    ...
    }
    

    keksekekse schrieb:

    Schau Dir deine if-Konstrukte mal genauer an.

    🙂

    Würde er nicht falls das erste zutrifft nicht aus der inneren Schleife rausspringen und das war's, nicht erst zum zweiten Break gelangen?

    keksekekse schrieb:

    if (fd < 0) {
    

    Die öffnende Klammer in der gleichen Zeile wie das if waren mir schon immer suspekt. Schau Dir deine if-Konstrukte mal genauer an.

    Welcher Compiler? Ich würde den immer auf die höchste Warnstufe stellen.

    gcc. Find aber auch grad nicht wie ich die Warnstufe veränder, auch nicht mit google 😕

    Echt kein Plan schrieb:

    Debugger.

    Und wieder muss ich mit Unwissen strotzen. Das Programm läuft auf der PSP, da weiß ich nicht wie ich debugge...



  • Luke-2 schrieb:

    Würde er nicht falls das erste zutrifft nicht aus der inneren Schleife rausspringen und das war's, nicht erst zum zweiten Break gelangen?

    Nein, dazu muss es in geschweiften Klammern stehen :

    if((rc = recv(fd,command_buffer_s,2,0)) < 0)
     {
      printf("Command: Error while recieving\n");
      break;
     }
    

    Ohne Klammern würde, falls die Bedingung zutrifft, nur "printf(...)" ausgeführt werden. Auf jeden Fall würde dann aber bei "break;" weitergemacht.



  • Guck dir doch mal deinen Code genauer an

    if((rc = recv(fd,command_buffer_s,2,0)) < 0) 
                printf("Command: Error while recieving\n"); 
                break;
    

    Ich sehe da keine Klammern, du? Heißt, falls "if((rc = recv(fd,command_buffer_s,2,0)) < 0)" zutrifft, gibt er "printf("Command: Error while recieving\n");" aus, aber "break;" führt er immer aus und springt daher aus der Schleife.



  • Luke-2 schrieb:

    gcc. Find aber auch grad nicht wie ich die Warnstufe veränder, auch nicht mit google 😕

    gcc --help me plz

    oder

    google gcc warn level

    http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

    gcc -Wall



  • oh, ok, viele Augen sehen doch mehr als 2... Danke Leute!



  • keksekekse schrieb:

    Luke-2 schrieb:

    gcc. Find aber auch grad nicht wie ich die Warnstufe veränder, auch nicht mit google 😕

    gcc --help me plz

    oder

    google gcc warn level

    http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

    gcc -Wall

    Danke, ich hatte man "gcc warnlevel" gesucht...


Anmelden zum Antworten