Datenaustausch zwischen 2 Rechnern - API?



  • Hallo,

    ich benötige für (m)ein Projekt die Möglichkeit, mehrere Rechner miteinander sich verbinden zu lassen und Dateien austauschen zu können.

    Gibt es dafür evtl. eine API oder muss ich selber ran?

    Vielen Dank!



  • dazu würde ich dir sockets empfehlen. link zur pdf-version(ist vllt übersihtlicher)

    wenn du die ip-addressen der rechner kennst, kannst du damit eine verbindung aufbauen
    und daten übertragen


  • Mod

    Named Pipes!



  • Warum nimmst Du keine Datei-Freigaben für Dateien?



  • Dateifreigaben?

    Ich muss aus meiner Anwendung heraus bestimmte Dateien an eine IP senden können.

    Die Verbindung an sich kann ich aufbauen - mit WINSOCK funktioniert es soweit und ich kann auch Strings senden und empfangen.

    Wie kann ich jetzt aber eine Datei senden? Ich habe gelesen, man muss die binär einlesen, dann im Header die Größe und den Dateinamen senden.
    Ich habe aber keine Vorstellung, wie man das konkret macht.

    Kann ich mit Named Pipes eine neue Datei auf dem entfernten Rechner erstellen?



  • filth schrieb:

    Kann ich mit Named Pipes eine neue Datei auf dem entfernten Rechner erstellen?

    Nein.
    Bzw. ja, aber bloss genauso wie bei Sockets. D.h. du musst es "zu fuss" programmieren.



  • Ich tue mich noch schwer damit. Ich kriege es hin hart gecodete Strings zu übersenden, wie macgt man es bei Dateien mit variabler Größe?

    Wie würde ein Algorithmus für solch eine Übertragung aussehen? Wie bekommt man den Dateinamen und die Größe an den Empfänger?



  • Stell dir vor du würdest eine Struktur erstellen. Darin befindet sich der Dateinamen, die größe der anhängenden Daten vielleicht ne Kennung das es von deinem Programm kommt und was weiss ich noch, und ganz am Ende die eigentlichen Daten, das ganze jagste übers netz und ließt das auf der anderen Seite wieder und fertg.

    Mal schematisch muß net stimmen

    typedef struct SendHeader
    {
    	char		Kennung[5];
    	char		Dateiname[255];
    	DWORD		BinDataSize;
    }_SendHeader;
    
    CFile file;
    file.open("C:\\Test.exe");
    DWORD SendSize = sizeof(_SendHeader)+file.Size();
    void *buffer = new BYTE(SendSize);
    _SendHeader *Send = (_SendHeader *)buffer;
    strncpy(Send->Kennung,"ABCD\0");
    strncpy(Send->Dateiname,file.GetPathName());
    Send->BinDataSize = file.Size();
    File.Read(buffer[sizeof(_SendHeader)]);
    SendToNetwork(Buffer,SendSize);
    

    Hoffe das is etwas Verständlich.
    Gruß Matthias



  • Hallo Matthias,

    ja! Ich glaube das hilft mir weiter. Ich setze mich morgen mal dran.
    Vielen Dank schon mal!

    Noch eine Frage:
    Was bezweckt die Zeile:

    File.Read(buffer[sizeof(_SendHeader)]);
    

    ?

    Müsste die letzte Zeile nicht

    SendToNetwork(Send,SendSize);
    

    lauten?

    Grüße
    Alex



  • filth schrieb:

    Was bezweckt die Zeile:

    File.Read(buffer[sizeof(_SendHeader)]);
    

    ?

    Hier werden die Daten aus dem File was Du versenden willst, in den Buffer nach dem erzeugten Header geladen. Da ich davon ausgegangen bin das du eine Datei die auf der Platte is versenden willst, ansonnsten muß Du die zeile tauschen gegen das kopieren eines spiecherbereiches oder was auch immer du da reinschreiben willst.

    filth schrieb:

    Müsste die letzte Zeile nicht

    SendToNetwork(Send,SendSize);
    

    lauten?

    Die Zeiger Buffer und Send zeigen doch beide auf die selbe Adresse, also is das egal, wobei es vielleicht auch sinn macht den Buffer gleich als Byte-Zeiger beim erzeugen mit new zu deklarieren.

    Aber wie gesagt das is alles nur ausn Kopf geschrieben, also so könnte es gehen, im einzelfall sind da sicher noch haufen fehler drin, genauso is keine Fehlerbehandlung dabei. Aber den Teil überlass ich dir. 😃

    Gruß Matthias



  • Danke Matthias 🙂



  • Hi filth,

    könntest du deine Funktion zum Senden, sofern du es hinbekommen hast, posten?



  • Hallo,

    muss mich nochmal einklinken.
    Das Senden mit der Struktur funktioniert soweit. Ich habe aber noch Probleme, die Datei zu lesen.

    Wie kann ich entsprechend Speicher bereitstellen, wenn ich die Länge der Datei oder der einzelnen Zeilen nicht kenne?



  • Welches problem hast du mit der Datei lesen, ohne die zu lesen kannste die ja auch nicht verschicken, wobei sich dann die frage stellt für was du dann noch eine Größe brauchst. in meinem Beispiel war doch das laden der Datei mit dabei. oder was passt da nicht, ohne genauere Beschreibung wird dir keiner Helfen können.

    Gruß Matthias



  • Hallo Matthias,

    ich würde es gerne mit fstream lösen und die Datei zeilenweise einlesen und verschicken.

    fstream f;
    	char cstring[1024];
    	f.open("C:\\test.txt", ios::in);
    	while (!f.eof())
    	{
    		f.getline(cstring, sizeof(cstring));
    		strcpy(Send->DataLine, cstring);		
    	}
    	f.close();
    

    Das Problem hierbei ist die Länge der Zeile - die kann ja auch größer als 1024 Zeichen sein.

    ...ich glaube allerdings irgendwie verhacke ich mich gerade total...



  • CStdioFile f;
    	CString cstring;
    	f.open("C:\\test.txt",CFile::modeRead);
    	while (f.ReadString(cstring) == TRUE)
    	{
    	    strcpy(Send->DataLine, cstring);		
    	}
    	f.close();
    

    Mein Vorschlag dazu, mir leuchtet zwar nicht ein warum du nicht das ganze file auf einmal liesst, und warum du híer mit char-Puffer rumalberst wenn es dafür CString bzw. andere Klassen gibt, aber vielleicht kannst du mir das ja beantworten.

    Ansonnsten fstream hab ich noch nie benutzt, also kann ich dir da auch net helfen.

    Gruß Matthias



  • Hallo Matthias,

    ich habe Schwierigkeiten die MFC Klassen zu verweden.
    Wenn ich die MFC Bibliotheken aktiviere, meckert der Compiler, dass windows.h included wird.
    Entferne ich windows.h, bekommt das gl.h Probleme 😕



  • Aber de windows.h brauchste doch, ansonnsten wenn de eh kein MFC benutzt biste sogar im falschen bereich vom Forum (hier dreht sich alles um MFC). Da werden dir hier nur die eingefleichten helfen können, ich auf jeden Fall nicht.

    Gruß Matthias



  • filth schrieb:

    ...
    ich würde es gerne mit fstream lösen und die Datei zeilenweise einlesen und verschicken.

    fstream f;
    	char cstring[1024];
    	f.open("C:\\test.txt", ios::in);
    	while (!f.eof())
    	{
    		f.getline(cstring, sizeof(cstring));
    		strcpy(Send->DataLine, cstring);		
    	}
    	f.close();
    

    du kannst std::string und getline benutzen

    fstream f;
    	std::string cstring;
    	f.open("C:\\test.txt", ios::in);
    	while (!f.eof())
    	{
    		getline(f,cstring);
    		strcpy(Send->DataLine, cstring.c_str());
    	}
    	f.close();
    

    [/cpp]



  • Mal eine andere Frage, unabhängig von der Einlese-Geschichte:

    Auf der Empfängerseite habe ich folgendes:

    char buffer[256];		// On the stack
    
    	int nret = recv(theSocket,
    		buffer,
    		256,		// Complete size of buffer
    		0);
    

    Wie kann ich denn die Buffergröße abhängig von der Größe, der zu empfangender Daten, einstellen? - Gerne auch mit Benutzung von MFC 🙂


Anmelden zum Antworten