Dateitransfehr
-
Yea, das könnte eine Lösung sein und würde auch erklären
- warum Textdateien erfolgreich geschickt werden können (sie sind so klein, dass es keinen Überlauf gibt)
- warum der Doppelmoppelcode funktioniertandererseits: das int ist signed und wird bei einem Überlauf negativ, was bei folgendem Code Probleme macht: new byte[dataLength]; (Access Violation)
Es müsste schon ein verdammter Glücksfall sein, dass die Dateien gerade so groß werden, dass dataLength bei einem Überlauf wieder positiv wird.
-
word das find ich auch mekrwürdig... da sollte mindestens abstürzen wenn er nen überlauf bekommen sollte...
mhmm ich mache das so ähnlich, aber halt nicht zwischen server/client...
der CFile::Write() braucht als buffer nen const* void.... kann sein das er negative auch nimmt? und deswegen kein fehler auftritt?
-
schätze auch das es am int liegen wird, aber wenn das mit dem DWORD keine probleme gibt, dann nehme ich das auch. mann könnte doch auch einfach ein unsgned long nehmen
-
DWORD ist unsigned long

-
lol, erhlich ?? :D, gut zu wissen ^^
also kann man auch sagen:DWORD d = 4; unsigned long l; l = d;oder wie !?
-
Klar, und das sogar ohne cast:
So ist DWORD deklariert:typedef unsigned long DWORD;
-
habs gerade getestet ;). man hier lernt man immer dazu !!
dann ist das problem ja geklärt :p:p
-
Lass das
while (recvBytes > 0) { recvBytes = sockClient.Receive(data, dataLength); //Get the whole thing destFile.Write(data, recvBytes); // Write it }weg, sonst kanns zu unangenehmen Nebenwirkungen kommen, wenn du noch mehr Daten über das Netzwerk verschickst

Grüße Rapha
-
das geht nicht, habs gerade getestet. habe ne videofile übertragen und die war nachher 0:00 minuten lang. also lieber doch da lassen das stück ;).
-
Ich bestehe drauf, bis mich jemand vom Gegenteil überzeugt

Könntest du mal beim Clienten den Wert von recvBytes nach sockClient.Receive(&dataLength, 4); mit der Dateigröße des Videofiles (das Orginale, das auf dem Server liegt) vergleichen.Hab grad kein VC++ installiert. Könntest du auch noch diese Variante des Client-Codes testen:
AfxSocketInit(NULL); CSocket sockClient; sockClient.Create(); // cInformation1 = ip adresse, FILESEND_PORT = port für übertragung if (sockClient.Connect(cInformation1, FILESEND_PORT)) { int dataLength; sockClient.Receive(&dataLength, 4); //Now we get the File Size first // cFSend_File = zielfile CFile destFile(cFSend_File, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); byte* data = new byte[500]; int recvBytes = 0; recvBytes = sockClient.Receive(data, 500); //Get the whole thing destFile.Write(data, recvBytes); // Write it while (recvBytes > 0) { recvBytes = sockClient.Receive(data, 500); //Get the whole thing destFile.Write(data, recvBytes); // Write it } destFile.Close(); delete data; sockClient.Close(); } else { // fehlermeldung ... }Ich habe den Verdacht, dass etwas mit recvBytes nicht stimmt.
Grüße Rapha
-
also habs gerade getestet:
recvBytes war nach der übertragung = 0. da ist dann wohl alles ok mit. aber der code den du gepostet hast der läuft nicht :(. warum willst du denn unbedingt das mit den 500 machen ??
-
Quatsch, ich habe natürlich nicht recvBytes gemeint, sondern dataLength

500 habe ich willkürlich gewählt (als Buffer) (was wegen der while-Schleife eigendlich nichts ausmachen sollte).
jetzt die Frage nochmal richtig
Könntest du mal beim Clienten den Wert von dataLength nach sockClient.Receive(&dataLength, 4); mit der Dateigröße des Videofiles (das Orginale, das auf dem Server liegt) vergleichen?
-
achso, ok. habe es verglichen und die ziel datei ist 100% genau so groß wie die quelldatei :p:D. glaubst du es jetzt ??
-
Red Skall schrieb:
achso, ok. habe es verglichen und die ziel datei ist 100% genau so groß wie die quelldatei :p:D. glaubst du es jetzt ??
Das heißt ja nix, hast du die Dateien schon mal mit einem Hex-Monitor vergleich, um zu sehen an welcher Stelle sie unterschiedlich sind?
-
ne, die mühe hab ich mir noch nicht gemacht. aber verstehe ich dic richtig das ich die beiden files dann vergleichen soll (die ja nun nicht nur 20 kb oder sowas groß sind) !?
wenn ihr wollt kann ich die hochladen, aber ist nicht nötig, oder ??
-
Red Skall schrieb:
ne, die mühe hab ich mir noch nicht gemacht. aber verstehe ich dic richtig das ich die beiden files dann vergleichen soll (die ja nun nicht nur 20 kb oder sowas groß sind) !?
Ich wollte nur wissen, ob du mal geprüft hast, ob es Übertragungsfehler sind? Dazu reichen die ersten 20 Bytes völlig aus.
-
Problem bei dem Quellcode:
Alles, was du nach der Dateiübertragung an den Client sendest, wird in die Datei geschrieben (->while Schleife).
-
Rapha schrieb:
Problem bei dem Quellcode:
Alles, was du nach der Dateiübertragung an den Client sendest, wird in die Datei geschrieben (->while Schleife).Das sollte die Dateien aber nicht komplett zerstören (wie beschrieben). Ich vermute, dass es schon am Anfang Probleme gibt. Darum wäre ja ein Vergleich der Daten (z.B. mit Windiff) hilfreich.

-
Die Datei ist ja erfolgreich übertragen worden, da alle weiteren Bytes bis auf die 1. 4 (welche eigendlich die Dateigröße und somit die weiter-zu-empfangene Bytes darstellen) gespeichert werden (einfach alle Bytes speichern, die übers Netz geschickt werden).
Soweit so gut. Wenn man jetzt aber noch weitere Informationen schicken will, werden diese auch in die Datei geschrieben (oder hab ich da was übersehen?).
-
meinst du alle bytes die übers netzwerk gesendet werden ?? das soll heißen wenn du ne datei mit diesem code kopierst und gleichzeitig z.b. eine datei normal über windows; und diese beiden sachen werden dann in eine datei geschrieben ?? oder meinst du wen weitere daten mit dem programmcode gleichzeitig kopiert werden


aber mal ernst, was genau meinst du denn jetzt ??
ja, hört sich ein bischen verwirrt an