Dateitransfehr
-
oh sorry, hast ja gesagt ich solls posten. ok hier ist der code:
(ach ja.: ich habe nur was am client geändert, nichts am server !!)Aber trotzdem der code vom server:
CSocket sockSrvr; CSocket sockRecv; CFile fFile; int iFileLength; AfxSocketInit(NULL); // FILESEND_PORT = port für übertragung sockSrvr.Create(FILESEND_PORT); sockSrvr.Listen(); // hier dem client mitteilen das er den transfehr starten soll, zumindest ist es so bei meinem programm if (sockSrvr.Accept(sockRecv)) { // cFSend_File = quellfile fFile.Open(cFSend_File, CFile::modeRead | CFile::typeBinary); iFileLength = fFile.GetLength(); sockRecv.Send(&iFileLength, 4); // 4 bytes long byte* data = new byte[iFileLength]; fFile.Read(data, iFileLength); sockRecv.Send(data, iFileLength); //Send the whole thing now fFile.Close(); delete data; sockRecv.Close(); } else { // fehlermeldung ausgeben ... }client:
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[dataLength]; int recvBytes = 0; recvBytes = sockClient.Receive(data, dataLength); //Get the whole thing destFile.Write(data, recvBytes); // Write it while (recvBytes > 0) { recvBytes = sockClient.Receive(data, dataLength); //Get the whole thing destFile.Write(data, recvBytes); // Write it } destFile.Close(); delete data; sockClient.Close(); } else { // fehlermeldung ... }das müsste aber auch bei dir laufen !? ich hab den code auch 1 zu 1 übernommen von codeguru. habe nur die entsprechenden variablen bei mir geändert
-
Hi,
ich halte folgenden Code immer noch für Doppeltgemoppelt
Red Skall schrieb:
int recvBytes = 0; recvBytes = sockClient.Receive(data, dataLength); //Get the whole thing destFile.Write(data, recvBytes); // Write it while (recvBytes > 0) { recvBytes = sockClient.Receive(data, dataLength); //Get the whole thing destFile.Write(data, recvBytes); // Write it }Könnte das noch jemand klären/erklären?

-
ich habe mal ne doofe frage,
ich habe die beiträge kurz und sehr leicht überflogen..ich habe es so verstanden die Dateien können nicht korrekt geöffnet werden?
vieleicht liegt an der Länge der Datei, du benutzt nen Int fuer die Länge der Datei...
kann ja sein das der int überläuft bzw. nicht die genaue grösse der Bytes besitzt die geschickt werden sollen?
ich benutze ein DWORD und habe keine probs....MfG
T1c4L
-
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).