sendData() mit Datei



  • Hallo!

    Ich möchte eine Datei von meinem Server an einen Client schicken. Ich habe mir bereits ein Client/Server-Pärchen gebastelt, dass einzele Buchstaben verschickt mit

    sendData("s");

    Wie versende ich jetzt eine Datei "datei.txt"?

    Danke für Eure Hilfe!
    J



  • Du liest die Datei in einen String ein und schickst dann diesen String durch SendData() (wenn sie char-Arrays blockweise senden kann, umso besser - im äußersten Notfall übergibst du jeden char einzeln an SendData()).



  • Hallo!

    Nochmal zum Thema sendData():

    Ich habe einen langen String(1000 Stellen), den ich mit sendData() verschicken will. Leider kommen nur die ersten 4 Stellen richtig an, gefolgt von Ñ@ ...
    Woran liegt das? Wie kann ich es ändern?

    Danke und Gruß!



  • joergh schrieb:

    Leider kommen nur die ersten 4 Stellen richtig an, gefolgt von Ñ@ ...
    Woran liegt das?

    An Fehlern in deinem Code.

    Wie kann ich es ändern?

    Mach's richtig. Mal im Ernst, wie soll man dir ohne Kenntnis des Codes helfen?



  • hmm was genau meinst du mit string ?

    char*

    oder

    std::string ?

    weil sonst könnte evt deine konvertierung schief glaufen sein ... gug mal ob ebensoviele "komische" zeichen ankommen wie in der textdatei steht ... dann is es garanteirt ein konvertierungsfehler 😉 Ich nehme an die SendData Fkt. ist von dir ... poste sie doch mal ...

    -> oder liest du evt die zeichen aus der Txt File falsch ein ?!

    Gruß Chris



  • Okay, anscheinend liegt mein Problem tiefer... Also:

    Verbindung Client/Server kunzt.

    ServerCode:

    int counthere = 0;
    
    	while(true) // forever
    	{
    		if (counthere < 10) 
    		{
    			int length = 1000;
    			char buff[1000];
    			if(recv(*refreshSocket, buff, length, 0))
    			{
    				if(buff[0] > 'a' && buff[0] < 'z' || buff[0] >= 0)
    				{
    					AfxMessageBox("Server");
    					sendData(buff);
    					sendData("ß");
    					FILE* f;
    					f = fopen("string__new.txt","a");
    					fprintf(f,buff);
    					fprintf(f,"\n");
    					fclose(f);	
    					counthere++;
    				}
    			}
    		}
    		else 
    		{
    			closeSocket(refreshSocket);
    			closeSocket(acceptSocket);
    			//connectToClient();
    
    			return 0;
    		}
    
    	}
    

    ClientCode:

    int count = 0;
    
    	char* s = "sss...sss" // Es sind 1000 s hintereinander
            sendData(s);
    	sendData("ß");
    
    	while(true) // forever
    	{
    		if (count < 10)
    		{
    			int length = 1000;
    			char buff[1000];
    
    			if(recv(derSocket, buff, length, 0))
    			{
    				if(buff[0] > 'a' && buff[0] < 'z' || buff[0] >= 0)
    				{				
    					AfxMessageBox("Client");
    					sendData(buff);
    					sendData("ß");
    					FILE *f;
    					f = fopen("string_new.txt","a");
    					fprintf(f,buff);
    					fprintf(f,"\n");
    					fclose(f);
    					count++;
    				}
    			}
    		}
    		else
    		{
    
    			//Socket schließen
    			closeSocket(&derSocket);
    			return 1;
    		}
    
    	}
    

    Infos dazu:
    Letzlich soll der s-String 10x hin- und hergeschickt werden. Das ß wird verschickt damit nicht ständig der s-String empfangen wird (Kann man den alternativ vom Socket löschen, nachdem man den einmal empfangen hat?)

    Mein Hauptproblem:
    Verschickt/Empfangen werden anscheinend nicht 1000 s, sondern - laut Dateiausgabe:
    "ssssß"

    Verschicke ich das ß nicht empfange/verschicke ich
    "ssss"+ 996 gleiche undefinierbare Zeichen(f ohne Längsstriche).

    Ich hoffe mir kann geholfen werden.
    DAnke!



    • Der Rückgabewert von recv ist kein bool. So kannst du nicht unterscheiden, ob etwas versendet wurde, oder ob ein Fehler aufgetreten ist.
    • Woher weiß sendData eigentlich, wieviele Zeichen es verschicken soll?
    • Mit diesem Code sendest du nur "ß", auf beiden Seiten. Wo soll da überhaupt ein s herkommen?


  • Ups, sorry!

    Im Clientcode fehlt zwischen Zele 4 und 5

    sendData(s);
    

    Habs mal nachträglich hinzugefügt...

    zu sendData():

    void myClient::sendData(char* buffer)
    {
    	send(derSocket,buffer,sizeof(buffer),0);
    }
    


  • buffer ist ein char*, sizeof(buffer) liefert dir dir Größe eines Zeigers auf deinem System, offenbar 4 -> Du versendest nur 4 Zeichen.



  • Super! Das wars! Danke!

    Hier noch eine kleine Nachfrage:

    Muss ich - in meinem Fall - das ß immer hinterherschicken? oder gibt es eine Möglichkeit a la leereDenSocket()?



  • joergh schrieb:

    Muss ich - in meinem Fall - das ß immer hinterherschicken?

    Ich habe nicht verstanden, warum du das überhaupt tust. Dir muss klar sein, dass deine Daten nicht nullterminiert sind, wenn du nicht ausdrücklich eine Nullterminierung mit verschickst oder nach dem Empfang anhängst. Wenn du nicht nullterminierte Daten mit fprintf speicherst, darfst du dich nicht wundern, wenn da irgendwelche Zeichen angehängt werden.


Log in to reply