Dateitransfehr
-
ja, äh

also kopiert er das schon so wie ich das haben will oder wie !?aber wenn ja: warum kann er die übertragenden dateien nicht öffnen ??
-
Red Skall schrieb:
also kopiert er das schon so wie ich das haben will oder wie !?
Genau

Red Skall schrieb:
aber wenn ja: warum kann er die übertragenden dateien nicht öffnen ??
Wer kann die Dateien nicht öffnen? Du? Das Programm? Existiert die kopierte Datei?
Grüße Rapha
-
wenn ich z.b. eine datei vom verser emfangen hab, kann ich sie nicht öffnen. also wenn ich doppelklick halt auf die emfangene datei machen will
-
Welche Dateiendung hat die Datei?
Was kommt für ein Fehler, wenn du sie öffnest?
-
ist bi allen dateien schätze ich mal die normalerweise nicht im ASCII-format gespeichert werden. aber ich hab zum test ne *.bmp übertragen. eigentlich sind auf dem bild 2 frauen
drauf, und das ist in farbe. wenn ich das bild dann öffne, ist das ganze bild grau !! als ich ne übertragene *.mpg file mit dem windowsmediaplayer öffnen wollte, hat er gesagt das er nicht abspielen kann weil ein unbekannter fehler festgestellt wurde
-
hm, stimmen die Dateigrößen überein?
Der Code ist eigendlich in Ordnung (schon allein deswegen, weil er von Codeproject ist)...
-
Hi,
also das Problem wurde bei Codeguru schon besprochen.
Erst soll es daran gelegen haben,d ass die Dateien größer 10KB
bzw 100Kb waren. Dann hat einer ne Lösung gepostet:http://www.codeguru.com/Cpp/I-N/network/winsocksolutions/comments.php/c2491/?thread=33146
http://www.codeguru.com/Cpp/I-N/network/winsocksolutions/comments.php/c2491/
I changed my "GetFile" function to the one below to get executables to work. ///////////////////////////////////////////////////////////////////////////// void GetFile() { #define PORT 34000 /// Select any free port you wish AfxSocketInit(NULL); CSocket sockClient; sockClient.Create(); // "127.0.0.1" is the IP to your server, same port sockClient.Connect("127.0.0.1", PORT); int dataLength; sockClient.Receive(&dataLength, 4); //Now we get the File Size first CFile destFile("C:\\output.exe", 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(); } /////////////////////////////////////////////////////////////////////////////Ich habs damals auch mal probiert, aber ich glaube es hat nicht so wirklich
geklappt
Good Luck. Wenn es geht bitte ganzen Code hier posten
-
Hm,
Hab zwar noch nie mit CSocket gearbeitet, aber ich finde den Code komisch.Er schreibt einfach alle Bytes bis auf die 1. 4 in eine Datei

Es könnte sein (weiß nicht genau), dass Teile der Pakete verloren gehen.
Start mal den Server und den Clienten auf dem gleichen Rechner und versuche so zu kopieren.
-
hab ich schon gemacht, euf gleichem rechner zu testen. kommt aber das selbe ergebnis raus
. danke für das beispiel von codeproject @Kristof. probiere ich gleich mal aus, muß nur noch was eben im garten machen
...[EDIT]
Ok, habs getestet und siehe da ... es geht :D. danke danke !!
-
Na dann Glückwunsch. Kannst du Client + Server bitte mal hier posten ?
Wäre nett, denn bei mir (oh Wunder) gehts noch nicht. Und die Frage
nach dem Dateitransfer wird sicher noch öfter kommen
-
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