fopen() macht probleme



  • 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 🙄


Anmelden zum Antworten