Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

Indy10 / etwas probleme mit selbstgebastelter unit

  Alt 24. Mai 2006, 20:20
Hi@all!

Ich bin gerade dabei, eine eigentständige Unit zu schreiben, die mit Hilfe von Indy-TCP Server und Client Dateistreams verschicken kann. Ich stelle mir folgendes vor:
Ich will einfach nur hinschreiben meineUnit.versendeStream(derStream,IpAdresse)
Um den Rest soll ich die Unit kümmern, in ihr soll server und client erzeugt und verwaltet werden.

ich habe dafür folgenden Code erstellt:

Delphi-Quellcode:
unit MeineUnit;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent,IdStreamVCL, IdComponent, IdTCPServer,IdTCPConnection,
  IdTCPClient,IdContext;

  var
  TCPClient1: TIdTCPClient;
  TCPServer1: TIdTCPServer;
  procedure Start(port:integer);
  procedure Stop();
  procedure SendStream(Stream: TFilestream;Host:String);
  procedure ReceiveStream(Acontext:TidContext);

implementation

procedure Start(port:integer);
{
+Aktiviert TCPClient und TCPServer
+Sollte immer am Start des Programms aufgerufen werden.
+zuletzt editiert: 24.05.06
}

begin
TCPClient1:= TIdTCPClient.Create;
TCPClient1.Port:=Port;
with TCPClient1 do
begin
  ReadTimeout:=5000;
  ConnectTimeout:=5000;
end;

TCPServer1:= TIdTCPServer.Create;
@TCPServer1.OnExecute:=@ReceiveStream;
with TCPServer1 do
begin
  MaxConnections:=1;
  DefaultPort:=Port;
  Active:=True;

end;
end;
procedure Stop();
{Stopt Server und Client, gibt Speicher frei.
zuletzt editiert: 24.06.05}

begin
TCPClient1.Free;
TCPServer1.Active:=False;
TCPServer1.Free;
end;
procedure SendStream(Stream: TFilestream;Host:String);
{
+Versendet vom TCPClient an TCPServer einen Filestream
+Dieser wird als Parameter übergeben, und muss vorher erzeugt worden sein.
+zuletzt editiert: 24.05.06
}

var
  IndyStream: TidStreamVCL;
begin
TCPClient1.Host:=Host;

  try
    IndyStream := TidStreamVCL.Create(Stream);
    try
      { Senden }
      with TCPClient1 do
      begin
        Connect;
        try
          Socket.Write(IndyStream, 0, true);
        finally
          Disconnect;
        end;
      end;
    finally
      FreeAndNil(IndyStream);
    end;
  finally
    FreeAndNil(Stream);
  end;
end;
procedure ReceiveStream(Acontext:TidContext);
var
  FSTream: TFileStream;
  SizeOfIncomingStream: Integer;
  IDS: TidStreamVCL;
begin

  FStream := TFileStream.Create('C:\test.tmp', fmCreate);
 try
    IDS := TidStreamVCL.Create(FStream);
    try
      { Empfangen }
      with AContext.connection do
      begin
        try
          SizeOfIncomingStream := Socket.ReadInteger;
          Socket.ReadStream(IDS, SizeOfIncomingStream);
        finally
          Disconnect;
        end;
      end;

      { Damit der Inhalt von IDS in FStream übertragen wird }
      IDS.VCLStream.Position := 0;
    finally
      FreeAndNil(IDS);
    end;
  finally
    FreeAndNil(FStream);
  end;
end;


end.

Leider überträgt das ganze System noch keine Dateien. D.h. Die Datei kommt zwar an, ist aber leer, also wird der filestream nicht aufgefüllt.
Ich weiß, das ist jetzt ziemlich blöd, weil ich den fehler nicht genauer eingrenzen kann, aber ich hab mir schon stundenlang den kopf darüber zerbrochen...kann das was mit dem "@TCPServer1.OnExecute:=@ReceiveStream;" zu tun haben...was genau bewirkt das "@" eigentlich?

Sorry, dass ich hier mit so was aufwendingem einfach reinplatze

Wäre cool, wenn ihr ne lösungsidee habt

Vielen lieben dank,

euer alleinherrscher
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat