Dateitransfehr



  • 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 funktioniert

    andererseits: 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 ??


Anmelden zum Antworten