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 requestsSorry 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 requestswenn 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...