Bitte Hilfe zu TcpClient/TcpServer


#1
Bin im C++ Builder auf TcpClient und TcpServer gestoßen.
Habe dann im Internet und hier nach Beispielen etc. gesucht habe aber nichts Großartiges gefunden. (auch in der C++Builder Hilfe nicht).

Jedenfalls möchte ich wissen ob man damit eine Datei von Computer zu Computer über das Internet schicken kann?
Anscheinend geht es aber wie?

Hat jemand eine Idee wo man einen Beispiel Code ,oder eine genaue Beschreibung findet?


Schonmal Danke in Vorraus. ;)
 
#3

CSANecromancer

Erfahrenes Mitglied
#4
Ok, jetzt hatte ich mal etwas Zeit mir das Ganze anzuschauen.
Im zweiten von dir geposteten Link ist u.a. dieser Delphi-Code drin:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  FStream: TFileStream;
  SizeOfFile: Integer;
  pBuffer: Pointer;
begin
  FStream := TFileStream.Create('C:\Programme\TEXT22.txt', fmCreate or fmOpenWrite);
  SizeOfFile := TcpClient1.BytesReceived;
  GetMem(pBuffer, SizeOfFile);

  try
    TcpClient1.ReceiveBuf(pBuffer^, SizeOfFile);
    FStream.Write(pBuffer^, SizeOfFile);

  finally
      FreeMem(pBuffer);
      FStream.Free;
  end;

end;
Übersetzt nach CBuilder sieht das dann so aus:
C++:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TFileStream *FStream = new TFileStream("C:\Programme\TEXT22.txt", fmCreate || fmOpenWrite);
  int SizeOfFile = TcpClient1->BytesReceived;
  char *pBuffer = (char *) malloc(SizeOfFile);

  try
  {
    TcpClient1->ReceiveBuf(pBuffer, SizeOfFile);
    FStream->Write(pBuffer, SizeOfFile);
  }
  __finally
  {
    free(pBuffer);
    delete(FStream);
  }
}
Generell (falls du kein Pascal kennst) gilt:
Procedures sind in C++ einfach nur Funktionen mit void-Rückgabewert (also ohne Rückgabe). Functions sind Funktionen mit einem Rückgabewert, den du dem Funktionsheader entnehmen kannst.
Unter var sind dann erst einmal alle lokalen Variablen der Funktion deklariert. Instaziiert werden die Dinger meist später. Das ist etwas, was es so nicht zwingend unter C++ gibt. Wenn in Delphi also steht
Code:
var
  TFileStream: FStream
, dann heisst das nichts anderes als "in dieser Funktion wird eine Variable FStream verwendet, die vom Typ TFileStream ist". Implizit bedeutet das in Delphi jedoch, daß hier mit einem Pointer gearbeitet wird (da TFileStream kein grundlegender Datentyp ist). Zur echten Verwendung muß unter Delphi dann erst noch eine Instanz von TFileStream erzeugt werden:
Code:
FStream := TFileStream.Create('C:\Programme\TEXT22.txt', fmCreate or fmOpenWrite);
Wenn du FStream in C++ deklarieren und dann auch gleich verwenden willst, kannst du es auch sofort instanziieren:
C++:
  TFileStream* FStream = new TFileStream("C:\Programme\TEXT22.txt", fmCreate || fmOpenWrite);

Ich hoffe, ich konnte dir damit etwas weiterhelfen.
 
#5
Ja, da tu ich mir schon schwer bei den oben genannten Links, die in C++ umzuschreiben.

Habe aber dann noch einen Link gefunden, der (finde ich) ganz leicht zu verstehen ist: http://www.swissdelphicenter.ch/de/showcode.php?id=2213
Genau nach diesen Code habe ich dann, zum Test, eine Art simblen Chat gemacht, der auch sehr gut funktioniert!

Jetzt habe ich nur noch eine Frage bevor ich den Thread als "Erledigt" kennzeichne.
Frage: Wie sende ich jetzt ein File über diese Verbindung?


Aber schonmal Danke für die bisherige Hilfe! :)
 
#6
Moin Zusammen,

Also wenn ich Dich richtig verstanden habe, willst Du bloß ne Datei vom lokalen Rechner auf'n Server bringen oder/und vom Server wieder auf'n lokalen Rechner zurückholen?

Dafür nehme ich immer die Komponente TIdFTP aus der Komponentenpalette Indy-Clients. Ist glaub' ich bereits ab der 2006er dabei?! Ab 2007 auf jeden Fall!

Kurzes einfaches Beispiel für Upload
Code:
IdFTP1->Host = "<namedesservers.de>";
IdFTP1->Username = "<benutzername>";
IdFTP1->Password = "<passwort>";

IdFTP1->Connect();
IdFTP1->ChangeDir("/pfad/zum/verzeichnis");
IdFTP1->Put("C:\\pfad\\zum\\lokalen\\verzeichnis\\<dateiname.txt>","<serverdateiname>",false);

IdFTP1->Disconnect();
Der Download sieht genau so aus mit Ausnahme, daß die Put-Methode durch die Get-Methode ersetzt wird
Code:
IdFTP1->Get("<serverdatei>","C:\\pfad\\zum\\lokalen\\verzeichnis\\<dateiname.txt>",true,false);
Wie gesagt, wenn's Dir nur darum geht, ist das damit relativ einfach!
:)
 
#7
Jein.
Ich will eine Datei von einem Rechner zu einem anderen Rechner schicken.
Wahrscheinlich geht das mit Client/Server Komponenten, vielleicht zugar mit den TIdFTP und den TIdFTPServer. Die Frage ist nur wie.

Also ich wollte eigentlich nicht die Datei auf einen FTP-Server hochladen und dann wieder runterladen. Wäre auch ne Möglichkeit,aber mit meiner Internetverbindung dauert es viel zu lange. Und für größere Dateien ist das dann auch ungünstig.



Trotzdem muss ich sagen, das ich vor einiger Zeit auf der Suche war, wie man eine Datei auf einen FTP-Server lädt. Und da habe ich lange danach gesucht. Danke! :)