Daten über Netzwerk holen



  • Ich möchte in C++ ein kleines Tool schreiben das in bestimmten Zeitintervallen sich Daten von einem Rechner über Netzwerk holt und sie auf dem Lokalen Rechener wo auch das Tool läuft in einem bestimmten Ordner ablegt.

    Leider habe ich keine Ahnung wo ich überhaupt anfangen soll.

    Gibt es vielleicht dafür ein Beispielprogramm das jemand mal geschrieben hat?

    Vielen Dank für eure Hilfe



  • Hallo

    das kommt darauf an, was für Daten du für mit welchem Dienst du holen willst.
    Für Dateien im allgemeinen kannst du zum Beispiel idFTP aus dem Indy-Package nehmen, wenn diese auf einem FTP-Server liegen.
    Analog mit HTTP und Web-Server.

    Mit TServerSocket/TClientSocket hingegen kannst du selber ein Protokoll mitsamt Server aufbauen.

    bis bald
    akari



  • Ich habe doch gar keinen Sever!? Oder habe ich jetzt was falsch verstanden? Bin noch nicht so gut in C++.

    Noch mal etwas genauer:

    Ich habe 2 Rechner, mein 1. hat die IP 192.168.0.1 und der 2. 192.168.0.2.
    nun möchte ich durch drücken eines Buttons (Programm läuft auf Rechner 1) der komplette Inhalt aus einem Ordner von Rechner 2 in den Ordner "C:/Test" von Rechner 1 geschrieben wird.

    Bitte eine genaue Antwort, danke!



  • Hi,
    das, was akari geantwortet hat, hat bis hierhin erst einmal gar nichts mit C++ zu tun.
    Das du noch nicht soviel Ahnung vom Programmieren hast, haben wir gerade erkannt.
    Aber viel wichtiger ist wahrscheinlich erst einmal die Frage, wie gut kennst dich überhaupt mit Computern aus, mit Netzwerken, Protokollen, Datenaufbau?

    Das alles sind Sachen, die du zumindestens ansatzweise kennen solltest, da deine Frage dies alles mit anspricht.



  • Hallo

    Das hat weniger etwas mit C++ zu tun, sondern ist eine Netzwerk-Frage.

    Du hast immer einen Server und einen Client, die über einen definiertes Protokoll/Dienst kommunizieren.
    Der Client wird vom Benutzer angewiesen, sich mit dem auf Abruf bereiten Server zu verbinden.
    In deinem Fall könntest du zum Beispiel den Windows-Dienst Netzwerk-Freigabe als Server benutzen, um vom Client aus auf die Dateien per einfacher WinAPI-Funktion CopyFile o.ä. zugreifen zu können.
    Oder auf dem Zielrechner läuft ei n FTP-Server, das vom Benutzer mit einem FTP-Client angesprochen wird.

    bis bald
    akari



  • Hi Jule, leider geht das nicht so einfach wie du dir das momentan denkst. Akari hat da schon das wesntliche gesagt wie es Funktioniet. Irgendwie hab ich auch ein kleines Problem damit das du sagst, dass C++ nich gerade Alltag für dich ist. Ich könnte dir jetzt viel erklären aber ob du es nachvollziehen kannst ist fraglich. Das Beste wäre für dich das du dir die Chat demo in deinem Borland Verziechniss anschaust und lernst was ein Server ist und welche Aufgabe ein Client hat, lerne wie man Socketverbindungen aufbaut und Daten über sie senden kannst. Nehm dir das Ziel anhand der Demo ein eigenes Programm nachzuschreiben was ein einfaches "Hallo" vom Client an den Server sendet und der Server dieses "Hallo" in einer Memo Komponente ausgibt. Ab da können wir mal Anfangen dein eigentliches Problem auszubauen 😉

    Edit: Ok, dein Problem kann man auch über die WinApi lösen und die Verbindung über Netzlaufwerke realisieren.



  • Ich habe jetzt nach langem Suchen das im Internet gefunden, und es funktioniert soweit auch, nur jetzt habe ich das Problem das der Befehl nur eine bestimmte Datei überträgt und nicht wie von mir gewünscht den ganzen Ordner, was muss ich ändern???

    #include "Windows.h"
    
    {
    bool hatGeklappt = CopyFile("\\\\192.168.0.2\\a\\test\\a.exe", "C:\\BU2\\c.exe", true);
    if (hatGeklappt == false)
    Memo1->Text = GetLastError();
    else
    Memo1->Text = "Freu!";
    }
    


  • Hallo,

    CopyFile überträgt nur einzelne Dateien. Schau mal in diesen FAQ-Beitrag



  • Danke, aber dies ist ja eine komplett andere Methode.
    Ich würde schon ganz gerne meine beibehalten.
    Wie mache ich es also das ich nicht nur eine bestimmte Datei sondern alle Dateien in einem Ordner übertrage???





  • Habe erst zu spät gesehen, dass der gepostete Link auch den gleichen Tipp beinhaltete.

    Glaub mir, du willst diese Funktion benutzen.

    CopyFile überträgt nur 1 Datei. Es liegt jetzt dann also an dir, alle Dateien in diesem Verzeichnis zu suchen, zu erfassen und nacheinander zu kopieren. Dazu gibt es FindFirst und FindNext.

    Allerdings -> wieso einfach, wenn es auch umständlich geht



  • Danke für den Link.
    Ich habe jetzt folgenden Quellcode auf einem Button gelegt:

    if(!MoveFiles("d:\\test", "e:\\temp"))
      ShowMessage("Ausführung erfolgreich !");
    else ShowMessage("Fehler aufgetreten !");
    

    Bei mir kommt immer die Meldung "Ausführung erfolgreich". Doch leider wurden keine Dateien verschoben/kopiert, liegt es vielleicht daran das ich das selbe Laufwerk verwende (c:)? Oder habe ich noch etwas vergessen?



  • Versuchs mal mit

    MoveFiles("d:\\test\\*.*", "e:\\temp\\*.*")
    


  • Geht leider auch nicht. Dazu kommt noch wenn ich MoveFiles schreibe dann bekomme ich eine Fehlermeldung bei deklarieren (undifinierte Funktion 'MoveFiles') wenn ich das s wegmache, also MoveFile, dann geht es!



  • hä?



  • @jule0802
    Hast du die Funktion aus Christians Link denn auch drin?
    MoveFile ist wieder eine API-Funktion, die auch wieder nur eine Datei verschiebt.
    Nimm bitte die Funktion aus meinem (FAQ) oder Christians Link, deklariere und definiere sie und das wird schon gehen.
    Ansosnten wäre es hilfreich wenn du etwas mehr Quelltext poste würdest.



  • Sorry, ich denke ich habe mich falsch ausgedrückt und man hat meinen letzten eitrag falsch verstanden. Wenn ich das s wegmache also MoveFile, dann deklariert c++ das Programm ohne Fehlermeldung, aber das Programm selbst funktioniert nicht. Kann nicht jemand mal ein Beispielquellcode posten der bei ihm funktioniert? Wäre echt super nett.



  • Anders rum. Poste du etwas mehr Code. In den angegebenen Links steht alles was du brauchst. Du mußt es aber auch verwenden.



  • oben steht doch mein ganzer Quelltext, und dieser liegt wie schon gesagt auf einem Button, aber hier noch einmal:

    if(!MoveFiles("d:\\test", "e:\\temp")) 
      ShowMessage("Ausführung erfolgreich !"); 
    else ShowMessage("Fehler aufgetreten !");
    

    Ich denke das da ja noch was fehlen muss. Denn wie gesagt, wenn ich das ganze deklariere kommt der Fehler "Undifinierte Funktion 'MoveFiles'. Muss ich vielleicht noch etwas in die header schreiben?



  • Noch mal.
    Hast du die Funktion MoveFiles, wie im Link beschrieben in dein Programm eingefügt? Das ist keine Standardfunktion, weder bei Borland, noch bei Microsoft.
    Ums nochmal deutlich zu machen.
    In deiner cpp sollte etwa sowas noch stehen.

    int MoveFiles(AnsiString slSourceDir, AnsiString slTargetDir)
    {
      SHFILEOPSTRUCT sh;
      ZeroMemory(&sh, sizeof(sh));
      sh.hwnd = NULL;
      sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_FILESONLY;
      sh.wFunc = FO_MOVE;                  // Durchzuführende Operation
    
      slSourceDir+='\0'; // doppelte Nullterminierung
                   // erforderlich !
      sh.pFrom = slSourceDir.c_str();
    
      slTargetDir+='\0';                   // doppelte Nullterminierung
                                           // erforderlich !
      sh.pTo    = slTargetDir.c_str();
    
      sh.hNameMappings = NULL;
      sh.lpszProgressTitle = NULL;
      return SHFileOperation (&sh);         // Aktion durchführen
    }
    //---------------------------------------------------------------------------
    

Log in to reply