fopen() macht probleme
-
hallo ich habe ein problem
und zwar:
size = recv (new_socket, buffer, BUF-1, 0); datei1 = fopen(buffer, "r"); if(NULL == datei1) { strcpy(buffer, "no such file"); send(new_socket, buffer, strlen(buffer),0); } else { }
folgendes: also in char buffer[1024] steht der name der geöffnet werden soll (ja die datei existiert und sie beinhaltet auch einen satz bzw wörter). nur springt er mir jedes mal in das "if" rein.
ersetzte ich aber
datei1 = fopen(buffer, "r");
mit
datei1 = fopen("test.txt", "r");
springt er in die else zeile. auch wenn im buffer test.txt steht was ich schon (bevor er zu fopen kommt) mit printf("%s",buffer) geprüft habe, springt er trotzdem in das "if" hinein.
was übersehe ich da
Lg
-
Eventuell ein Flüchtigkeitsfehler, poste dazu mal etwas mehr Code - dann siehts vielleicht jemand..
Edit:
1. So kurze #defines wie "BUF" sollte man nicht verwenden.. (Könnte sich mit anderen symbolischen Konstanten überschneiden)Zum Thema:
Hast du mal (vor recv()) memset(buffer, 0, sizeof(buffer)) probiert? Und was sagt der Debugger zum Inhalt von buffer kurz vor fopen()?
-
da es eh nur eine hausübung ist hier mal der servercode:
while (1) { printf("Waiting for connections...\n"); new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen ); if (new_socket > 0) { printf ("Client connected from %s:%d...\n", inet_ntoa (cliaddress.sin_addr),ntohs(cliaddress.sin_port)); strcpy(buffer,"Welcome to myserver, Please enter your command:\n"); send(new_socket, buffer, strlen(buffer),0); } //Befehlsabarbeitungen bis Quit ausgeführt wird. do { //Befehl von Client erhalten size = recv (new_socket, buffer, BUF-1, 0); if( size > 0) { buffer[size] = '\0'; printf ("Nachricht angekommen: %s\n", buffer); strcpy(buffer, "which file?"); send(new_socket, buffer, strlen(buffer),0); do { size = recv (new_socket, buffer, BUF-1, 0); datei1 = fopen("test.txt", "r"); if(NULL == datei1) { strcpy(buffer, "no such file"); send(new_socket, buffer, strlen(buffer),0); } else { err = 0; if(datei1 != NULL) { while(!feof(datei1)) { fscanf(datei1, "%s", buffer); if (!feof(datei1)) { send(new_socket, buffer, strlen(buffer),0); } } fclose (datei1); } else { printf("Konnte Date nicht lesen\n"); } } } while (err != 0); } else { perror("recv error"); return EXIT_FAILURE; } } while (strncmp (buffer, "QUIT", 4) != 0); close (new_socket); } close (create_socket); return EXIT_SUCCESS; }
Also memset ändert nichts daran und der Debugger sagt, dass der Buffer mit "test.txt" befüllt ist.
Kurz zum obigen Ablauf, nachdem der Server das Cmd erhalten hat, schickt er zum Client which file? der Client schickt dann zum Server eben den Dateinamen, den er gerne hätte. In dem Fall eben "test.txt". Dann die Datei auslesen und mittel send zum Client übergeben.
Und dann fährt er mir immer ins "if" hinein.
-
cleverleinallein schrieb:
... send(new_socket, buffer, strlen(buffer),0); do { size = recv (new_socket, buffer, BUF-1, 0); ...
Mir fällt hier folgendes auf:
Beim Senden wird der Inhalt von 'buffer' verschickt, ohne ein abschließendes 0 - Byte. Falls das auf der Gegenstelle genauso gemacht wird, fehlt nach dem recv das abschließende 0-Byte im empfangenen String.
Im übrigen kann man sich nicht darauf verlassen, daß ein recv - Aufruf alles liest, was an der Gegenstelle gesendet wurde, es wäre denkbar, daß nicht alles in einem Rutsch ankommt.
-
Kann es sein, dass du
buffer
mit fgets einliest?Prüfe einmal, ob buffer[strlen(buffer)-1] '\n' ist und ersetzte diese Zeichen dann ggf. mit '\0'.
-
newline schrieb:
Kann es sein, dass du
buffer
mit fgets einliest?Prüfe einmal, ob buffer[strlen(buffer)-1] '\n' ist und ersetzte diese Zeichen dann ggf. mit '\0'.
Hallo ihr, danke erstmal.
Ja ich lese den Buffer mit fgets() am Client ein.
Ich verstehe jetzt eigentlich garnichts mehr. Ich habe jetzt folgendes getestet:
printf("%c\n%s\n", buffer[strlen(buffer)-1], buffer);
als ergebnis kommt:
? test.txt
test.txt kann ich mir natürlich erklären, aber wieso macht der ein ?.
-
Wenn du bei deinen Debugausgabe die Strings klammerst, kannst du leichter Steurzeichen erkennen. Bzw. gib den Wert des Zeichen aus.
printf("<%i|%s>\n", buffer[strlen(buffer)-1], buffer);
Wenn das > in einer neuen Zeile ist, hattest du ein \n drin.
-
DirkB schrieb:
Wenn du bei deinen Debugausgabe die Strings klammerst, kannst du leichter Steurzeichen erkennen. Bzw. gib den Wert des Zeichen aus.
printf("<%i|%s>\n", buffer[strlen(buffer)-1], buffer);
Wenn das > in einer neuen Zeile ist, hattest du ein \n drin.
Also er gibt mir danach folgendes aus:
<63|test.txt e?>
Somit ist es in einer neuen Zeile. Man wie soll man da draufkommen
Würde das ersetzen so funktionieren:
strcpy(buffer[strlen(buffer)-1],"\0"
Bin jetzt gerade auf dem Heimweg
-
Man wie soll man da draufkommen
Indem man bei Problemen Debugausgaben verwendet.
-
cleverleinallein schrieb:
strcpy(buffer[strlen(buffer)-1],"\0"
Nein.
Besser:if( strchr(buffer,'\n') ) *strchr(buffer,'\n')=0;
-
cleverleinallein schrieb:
Also er gibt mir danach folgendes aus:
<63|test.txt e?>
Das ist der Rest von deinem "which file?" :p
Das '\0' solltest du vor dem senden einfügen und mitschicken.
Beim Empfang schadet es allerdings auch nicht.
-
Hättest Du dir den Inhalt von buffer im Debugger mal ordentlich angeschaut, so wie ich es dir geraten hatte, wäre das Problem sofort gelöst gewesen