Dateiübertragung



  • Hallo

    Ich habe ein Netzwerk zwischen zwei Rechnern bei mir zuhause aufgebaut (natürlich läuft auf einem ein Winsock-Server und aufm anderen ein Client).

    Ich möchte nun vom Server eine Datei zum Client schicken.
    Wie mache ich das?

    Also eine Verbindung steht bereits.

    Kann mir jemand da weiterhelfen?
    Das wäre echt klasse!

    Julia



  • Eigentlich ist das ganz simpel: Datei laden und bröckchenweise rüberschicken 🙂
    Kannst du denn mit deinem selbstgebastelten Code auch Binärdaten verschicken oder nur Texte? Sonst halt nachrüsten.



  • Also Binärdaten kann ich nicht versenden. Ich kann einfache zeichenfolgen versenden. also auf der Basis von char...

    So in etwa sieht mein Code aus (zumindest in den jetzt grade interessanten abschnitten 😉 )

    Client

    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    
    void main()
    {
       WSADATA wsa; 
       WSAStartup(MAKEWORD(2,0),&wsa);
    
       SOCKET s;
       s = socket(AF_INET,SOCK_STREAM,0);
    
       SOCKADDR_IN adr;
       memset(&adr,0,sizeof(SOCKADDR_IN));
       adr.sin_family=AF_INET;
       adr.sin_port=htons(47);
       adr.sin_adr.s_adr=inet_addr("192.172.30.47");
    
       connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    
       send(s,"Datei",5,0);
    }
    

    Server

    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    
    void main()
    {
       WSADATA wsa; 
       WSAStartup(MAKEWORD(2,0),&wsa);
    
       SOCKET accept;
       SOCKET connected;
       accept = socket(AF_INET,SOCK_STREAM,0);
    
       SOCKADDR_IN adr;
       memset(&adr,0,sizeof(SOCKADDR_IN));
       adr.sin_family=AF_INET;
       adr.sin_port=htons(47);
       adr.sin_adr.s_adr=ADDR_ANY;
    
       bind(accept,(SOCKADDR*)&addr,sizeof(SOCKADDR));
       listen(accept,10);
       connected = accept(accept,NULL,NULL);
    
       char file[4];
       recv(connected,file5,0);
    }
    

    So sieht der Verbindungsteil meines Codes aus. Was muss ich tunen damit ich dateien versenden kann?
    Ich glaube der schwerste teil ist die Datein so zu entpacken, das Zeichen ausgelesen werden können die nach dem übertragen und zusammensetzen auf der anderen Seite wieder eine komplette Datei ergeben, oder?

    Julia



  • July1983 schrieb:

    So sieht der Verbindungsteil meines Codes aus. Was muss ich tunen damit ich dateien versenden kann?
    Ich glaube der schwerste teil ist die Datein so zu entpacken, das Zeichen ausgelesen werden können die nach dem übertragen und zusammensetzen auf der anderen Seite wieder eine komplette Datei ergeben, oder?

    Julia

    Nö, das ist ganz einfach. Du öffnest die Datei, liest einen Block in deinen Buffer und versendest diesen dann per send. Das machst du so lang bis du die komplette Datei versendet hast.

    Der Client muss natürlich so lang empfangen bis die kompletten Daten gesendet wurden. Also einfach in einer Schleife per recv Empfangen bis die Daten komplett sind.


  • Administrator

    July1983 schrieb:

    Also Binärdaten kann ich nicht versenden. Ich kann einfache zeichenfolgen versenden. also auf der Basis von char...

    Dir ist das folgende klar?

    • Zeichenfolgen sind Bytefolgen
    • Bytefolgen sind Binärdaten
    • Du benutzt Windows -> wegen Winsock
    • char ist auf Windows gleich einem Byte
    • Man kann über Sockets nur binär senden

    Alles was du also machen musst, ist die Datei einzulesen und ein Protokoll zu definieren, wie du die Datei überträgst. Ganz trivial, du sendest zuerst 8 Bytes, welche die Grösse der Datei angeben und danach sendest du die angegebene Menge an Bytes, also die Datei.

    Auf der anderen Seite, wartest du auf den Empfang. Liest 8 Bytes aus und weisst somit, wieviele Bytes nun noch kommen, bis die Datei komplett ist. Die liest du ein und speicherst sie in einer Datei ab.

    Wo ist das Problem?

    Grüssli



  • Okay. Das klingt beruhigend. 🙂

    Nur wie öffne ich die Datei?
    kann ich die mit ganz normalenm 0815-Standard auslesen? Also so:

    #include <fstream>
    
    (..)
    
    ifstream f;
    
    f.open("Dateiname",,ios_base::in);
    
    f.get(zeichen);
    

    Kann man mit diesem Verfahren auch Anwendungen über das Netzwerk versenden?

    Julia



  • Kann man mit diesem Verfahren auch Anwendungen über das Netzwerk versenden?

    Jegliche Art von Daten, hauptsache, sie lassen sich in eine Folge von Bytes bringen oder liegen schon so vor (File).
    Simon


Anmelden zum Antworten