TCP Socket Datei übertragen
-
Ich bin gerade dabei, mich in die Win Socket Programmierung einzuarbeiten. Jetzt will ich mir als kleine Übung ein Programm basteln, welches eine beliebige Datei an den Server sendet. Das Prinzip müsste ja eigentlich so sein:
-Client öffnet beliebige Datei und liest den Inhalt in einen Buffer
-Server erstellt gleichnamige Datei und wartet auf den Buffer vom Client
-Client sendet den Buffer
-Server empfängt diesen und schreibt ihn in die Datei und schließt sieDas ganze habe ich dann mal so umgesetzt:
Client:int y; f.Open( "datei.txt", CFile::modeRead); while( true) { ZeroMemory(buf,sizeof(buf)); recv(s,buf,5,0); if( strcmp(buf, "next") == 0) { ZeroMemory(buf,sizeof(buf)); y=f.Read( buf, 1024); /* Es werden 1024 Zeichen eingelesen, da die Buffer Variable ein char mit 1024 Feldern ist */ send( s, buf, sizeof( buf), 0); if( y<1024) { break; } } } f.Close(); send( s, "finish", 7, 0);Server:
f.Open( "datei.txt", CFile::modeCreate | CFile::modeWrite); while( true) { ZeroMemory(buf,sizeof(buf)); send(connectedSocket,"next",5,0); recv(connectedSocket,buf,sizeof(buf),0); if(strcmp(buf, "finish") == 0) break; f.Write( buf, sizeof(buf)); } f.Close();Mit Text-Dateien funktioniert das Ganze auch wunderbar, bei .exe Dateien werden aber nur die ersten paar Zeichen kopiert. Weiß jemand woran das liegen könnte?
-
Du benutzt mehrfach strlen() dieses zählt die Zeichen bis zum ersten 0-Byte (\0). Das Stringende wird in einem char-Array durch ein solches 0-Byte angezeigt.
In einer exe-Datei kann das 0-Byte an beliebiger Stelle auftauchen. Daher bricht deine Übertragung beim ersten 0-Byte ab.
-
Ich hab jetzt mal alle strlen durch sizeof ersetzt. Jetzt werden die Daten zwar korrekt übertragen, aber die Abbruchbedingung im Client: sizeof(buf)<1024 wird nicht mehr erfüllt, sodass der Inhalt der Datei etliche Male verschickt wird. Weiß jemand, woran das liegen könnte?
-
sizeof(buf) liefert IMMER 1024 zurück, da es nur die Größe von 'buf' ermittelt, aber nicht die Größe der sinnvollen Daten in 'buf'.
CFile::Read() liefert im return-Wert, wieviele Byte tatsächlich gelesen wurden. Dies solltest du überprüfen.
http://msdn2.microsoft.com/en-us/library/ctka0kks(VS.80).aspx
MSDN schrieb:
Return Value: The number of bytes transferred to the buffer.
-
Wow, vielen dank! Es klappt endlich.
-
Kannst du mal deinen Server und Client in aktueller Version posten?
Bei mir sendet der Client unendlich, wenn er keine aktive Gegenstelle
findet.
-
Hab meine Lösung nochmal reineditiert.
-
rückgabewert von recv MUSS geprüft werden