Autor Beitrag
DeltaEx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Di 10.12.02 14:46 
hab ein Problem ich habe diesen Code um dateien im Netz zu verschicken, der ist aber für ClientSocket und ServerSocket. Kann mir in einer in INDY umschreiben?? Danke im voraus

Client:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
procedure TForm1.ClientSocket1Read(Sender: TObject; 
  Socket: TCustomWinSocket); 
var 
  iLen: Integer; 
  Bfr: Pointer; 
begin
  iLen := Socket.ReceiveLength; 
  GetMem(Bfr, iLen);
  try 
    Socket.ReceiveBuf(Bfr^, iLen); 
    FStream.Write(Bfr^, iLen); 
  finally 
    FreeMem(Bfr); 
  end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin
  FStream := nil; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin
  if Assigned(FStream) then 
  begin 
    FStream.Free; 
    FStream := nil; 
  end;
end; 


procedure TForm1.ClientSocket1Disconnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  if Assigned(FStream) then 
  begin 
    FStream.Free; 
    FStream := nil; 
  end; 
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin
  FStream := TFileStream.Create('c:\DirectDVD.exe', fmCreate or fmShareDenyWrite);
end; 





procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active := True; 
end;


Server:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.FormCreate(Sender: TObject); 
begin
  FStream := nil; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  if Assigned(FStream) then 
  begin 
    FStream.Free; 
    FStream := nil; 
  end; 
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  Socket.SendStream(TFileStream.Create('D:\DirectDVD.exe', fmOpenRead or fmShareDenyWrite));
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Active := True;
end;

_________________
Delphi forever
DeltaEx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Mi 11.12.02 21:49 
kann es hier keiner im Board???? das kann doch nicht sein

_________________
Delphi forever
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 12.12.02 09:14 
Poste doch mal Deine Versuche. Ich denke dann wird Dir auch geholfen!

Gruß
TINO
DeltaEx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Do 12.12.02 14:10 
wie meine Versuche??
Ich will eine Datei, igal wie groß senden übers Netz.

_________________
Delphi forever
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Do 12.12.02 14:27 
Das funktioniert aber auch mit den Sockets! Und zwar genau so, wie ich es im FAQ gemacht habe...

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
DeltaEx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Do 12.12.02 16:55 
Das ist klar das ein mit Socket geht das geht ja bei mir auch aber ich will das mit INDY-Komponenten machen!!!

Es muss doch einen geben der das weiss wie das geht

_________________
Delphi forever
hitstec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Do 12.12.02 17:24 
Nun, es gibt bestimmt viele Menschen hier, die eine Lösung für dein Problem hätten.
Nur die Problemlösung ist nun mal keine einfache Sache. Da müssen gewisse Informationen vorhanden sein, die dann in Ideen umgesetzt werden können.

Zum Bsp. der Versuch eine File mit mehr als 2 GB Größe zu verschicken. Das bringt schon Hacken und Ösen mit sich. Da muss man sich die Lösung erarbeiten.

Und darum gehts: Ich denke mal das es kaum jemanden hier gibt, der bereit ist Zeit und Nerven zu investieren, nur damit DU Dateien im Netzwerk verschicken kannst.

Aber keine Angst ich arbeite zur Zeit an so einem Programm, solltest du Fragen im bezug auf gewisse Probleme haben, dann stell sie ruhig.
DeltaEx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Do 12.12.02 18:26 
Was soll da so schwer sein? Ich will doch nur eine 50MB bis 300Mb datei schicken. Wie das mit Socket.komponenten geht weiss ich doch schon ist ja oben auch der Quellcode aber ich weiss es nur nicht wie ich es mit InDY-Komponenten verwirklichen kann!!

_________________
Delphi forever
hitstec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Do 12.12.02 18:42 
Gut.
Installier die Indys.

Client:
Zieh dir die TCP-Client-Kompo auf deine Form.
Connecte dich zum Server:
ausblenden Quelltext
1:
2:
3:
Client.Port:=12345;
Client.Host:=127.0.0.1;
Client.Connect;

Öffne die Datei zum Senden:
ausblenden Quelltext
1:
2:
3:
4:
5:
stmFile:=TFileStream.Create(Datei,...);
Client.WriteStream(stmFile);
stmFile.Free;

Client.Disconnect;


Server:
Zieh dir die TCP-Server-Kompo auf deine Form.
Erstelle das OnExecute-Ereigniss, indem du es im Objektinspektor doppelklickst.

Schreibe den empfangenen Stream in deine Datei
ausblenden Quelltext
1:
2:
3:
4:
stmFile:=TFileStream.Create(Datei,...);
stmFile.Position:=stmFile.Size;
AThread.Connection.ReadStream(stmFile);
stmFile.Free;

Oder so ähnlich.
DeltaEx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Sa 14.12.02 16:20 
ich habe das mit den Indy so gemacht: Die DirectDVD.exe' ist 10,5MB groß aber am anderen ende kommt es nur als 501 oder 521 kb :( WARUM?!?!

Client:
emfängt die Datei

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.Button5Click(Sender: TObject);
var
    ftmpStreamo : TFileStream;

begin
client.Host := edit1.Text;
//ipinput.Items[ipinput.ItemIndex];
try
with client do
    begin
    if connected then DisConnect;
    Connect;
    WriteLn('SRNO');

    ftmpStreamo := TFileStream.Create(ExtractFileDir(ParamStr(0)) + '\esgeht.exe',fmCreate);
    ftmpStreamo.Position := ftmpStreamo.Size;

    ReadStream(fTmpStreamo,1,true);
    fTmpStreamo.Free;

    Disconnect;
    end;
except
on E : Exception do
    ShowMessage(E.Message);
end;

end;


Sever:
Schickt die datei

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.serverExecute(AThread: TIdPeerThread);
var
    s, sCommand, sAction : string;
    fStream : TFileStream;
    jp: TJpegImage;
    Path: String;
    ini: TIniFile;
    Reg: TRegistry;
begin

try
  s := uppercase(AThread.Connection.ReadLn);
  sCommand := copy(s,1,3);
  sAction := copy(s,5,100);

  if sCommand = 'SRNO' then
    begin
         //----Jetzt senden---------
        fStream := TFileStream.Create('D:\DirectDVD.exe',fmOpenRead + fmShareDenyNone);


        Athread.Connection.WriteStream(fStream);
          fStream.Free;



        AThread.Connection.Disconnect;
    end;
end;

_________________
Delphi forever
hitstec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Sa 14.12.02 18:54 
Dann versuch im Client beim Empfang Folgendes:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
ftmpStreamo := TFileStream.Create(ExtractFileDir(ParamStr(0)) + '\esgeht.exe',fmCreate); 

stmStr:=TStringStream.Create(AllData);
ftmpStreamo.CopyFrom(stmStr,0);
stmStr.Free

fTmpStreamo.Free;
DeltaEx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Sa 14.12.02 19:33 
Ich bin verzweifelt :( ist genau wie vorher der schickt nur 501 kb rüber
Kann es sein das er es in 500kb Pakete zerteilt und nur ein Paket schickt?
Und die anderen nicht?

Woran kann es liegen????? HILFE

_________________
Delphi forever
Savage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 110



BeitragVerfasst: Sa 14.12.02 21:20 
Hi,

ich kenn mich zwar nicht mit Indy direkt aus, aber versuch doch mal ein paar kleinere Stücken immer zusenden, und nicht alles aufeinmal.

Ich habe z.B. ein Filetransfer über die normalen TClient/Serversocket-Kompos gemacht. Da versende ich pro übertragung immer "nur" 4kb und das solange, bis die File durchgezogen ist. Dabei bestätigt mir der Remote-Rechner immer die Ankunft der 4 kb - Stücke, sodass dann die nächsten geschickt werden.

Funktioniert bei mir zumindest spitze :)

MfG
Savage
hitstec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Sa 14.12.02 21:34 
Hmm, bei den Standard-Borland-Kompos, musst du tatsächlich in 4 KB Stückchen senden.
Indy hat das Problem aber schon längst erkannt und gelöst, sodass man als Programmierer sich nicht mehr darum kümmern muss.

@Savage: Du brauchst die Überprüfung, ob das Paket angekommen ist eigentlich gar nicht machen - das erledigt das TCP/IP Protokoll schon von selbst!
Savage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 110



BeitragVerfasst: Sa 14.12.02 21:41 
das schon, aber ich hatte z.B. anfangs ne While-Schleife gemacht, wo ich je zyklus 4 kb rausgeschickt hatte. Angekommen ware jedoch nur ein Bruchteil vom Gesamten :(.

Das Netz hatte also einen großen Teil "verschluckt" bzw. sind mir abhanden gekommen.

Deshalb hatte ich vom Remote ne bestätigung zum Host senden lassen, sodass er erkannt hat, dass er jetzt das nächste senden kann. Hat auch prima funktioniert.

Mfg
Savage
Sephiroth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Mo 16.12.02 10:57 
Eigentlich kann das doch nicht sein das ein TCP/IP paket nicht ankommt... Das Protokoll schickt doch automatisch eine Anforderung wenn ein Paket nicht angekommen ist.... Oder?
Savage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 110



BeitragVerfasst: Mo 16.12.02 14:07 
Das einige Pakete nicht ankommen liegt nicht am Protokoll sondern mehr oder weniger am "Programmierer", der zu hastig senden lässt.

Das Problem liegt darin, dass wenn man gerade Daten sendet, man ihn erstmal "zuende" senden lassen sollte, bevor man ihm das nächste gibt.

Und in meiner While-schleife hatte ich ihn einfach solange die Daten gegeben, bis meine File durchgelaufen war. Dabei wurde nicht berücksichtig, dass die Daten noch nicht vollständig übermittelt wurden. Ich tippe, dass der Buffer von der Kompo dann einfach überschrieben worden ist.
Sephiroth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Mo 16.12.02 15:37 
Also das mit dem Buffer wär noch die plausibelste Erklärung...
Weil jedes Paket genau weiss wo es hingehört, selbst wenn es schneller ankommt als sein Vorgänger