Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!? (https://www.delphipraxis.net/126028-indy-9-sample-udpclientserver-delphi-6-2006-a.html)

MarLe 16. Dez 2008 16:09


Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!?
 
Hallo,

Hat schon mal jemand dieses Indy Beispiel was unter Delphi 6 noch funktionierte unter Delphi 2006 zum Laufen gebracht ?

Delphi-Quellcode:
//procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  s: String;
begin
  DataStringStream := TStringStream.Create('');
  try
    // s := BytesToString(AData);
    DataStringStream.CopyFrom(AData, AData.Size);
    UDPMemo.Lines.Add('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
    s := 'Replied from ' + UDPServer.Name + ' to "' + DataStringStream.DataString + '"';
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, (s[1]), Length(s));
  finally
    DataStringStream.Free;
  end;
end;
Bei der Deklaration meckert er schon dass jetzt AData ein TBytes sein muss, was mit der Einbindung von IdGlobal dann auch klappt. Jetzt meckert er aber noch wegen AData.Size und bei s[1] und/oder Length(s) scheint sich auch was geändert zu haben.

Gruß MarLe

Klaus01 16. Dez 2008 19:26

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Delphi-Quellcode:
//procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  s: String;
begin
  DataStringStream := TStringStream.Create('');
  try
    // s := BytesToString(AData);
    DataStringStream.CopyFrom(AData,length(AData)); // <- length eingesetzt
    UDPMemo.Lines.Add('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
    s := 'Replied from ' + UDPServer.Name + ' to "' + DataStringStream.DataString + '"';
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, (s[1]), Length(s));
  finally
    DataStringStream.Free;
  end;
end;
TBytes = Array of Byte

Vielleicht geht es wie oben beschrieben.
Grüße
Klaus

MarLe 17. Dez 2008 10:52

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Hallo,

Leider nicht, "inkompatible Typen TStream und TBytes".
und unten "inkompatible Typen TidIPversion und Integer".
Trotzdem Danke für die Hilfe.

Benutzt keiner mehr die 9er Indy's bzw. nur UDP ?
Für die 10er Version scheint es gar kein UDP Sample mehr zu geben?!?

Gruß MarLe

Klaus01 17. Dez 2008 11:00

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Guten Morgen,

Du nutzt doch Indy 10, sonst hättest Du die Probleme nicht.
Es gab da so einige Änderungen von Indy 9 auf Indy 10.

ersetzte mal das:

Delphi-Quellcode:
DataStringStream.CopyFrom(AData,length(AData));
durch das:
Delphi-Quellcode:
DataStringStream.Write(AData,length(AData));
Grüße
Klaus

MarLe 17. Dez 2008 11:11

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Hallo,

... uuups tatsächlich, ich war mir jetzt sicher bei der Installation die 9er Version gewählt zu haben.
Hab noch nicht viel gemacht mit den Indy's, soll ich nicht besser die alte Version nehmen?

Dein Tipp hat gefunzt, Danke.

Jetzt zwickt's noch da:

Delphi-Quellcode:
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, (s[1]), Length(s));
"inkompatible Typen TBytes und Char".
"inkompatible Typen TidIPversion und Integer".

Gruß MarLe

Klaus01 17. Dez 2008 11:25

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Zitat:

Zitat von MarLe
Hallo,

... uuups tatsächlich, ich war mir jetzt sicher bei der Installation die 9er Version gewählt zu haben.
Hab noch nicht viel gemacht mit den Indy's, soll ich nicht besser die alte Version nehmen?

Dein Tipp hat gefunzt, Danke.

Jetzt zwickt's noch da:

Delphi-Quellcode:
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, (s[1]), Length(s));
"inkompatible Typen TBytes und Char".
"inkompatible Typen TidIPversion und Integer".



Gruß MarLe


Der Prozedurkopf schaut so aus:
procedure SendTo(const AIP: string; const APort: Integer; const ABuffer: TIdBytes;
const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION);

Delphi-Quellcode:
length(data,length(s)-1);
move(s[1],data,length(s)-1);
ABinding.SendTo(ABinding.PeerIp,ABinding.PeerPort,data);
wobei data vom Typ TBytes sein sollte.

Grüße
Klaus

MarLe 17. Dez 2008 12:45

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Hallo,

Delphi-Quellcode:
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  s: String;
  data: TBytes;
begin
  DataStringStream := TStringStream.Create('');
  try
    DataStringStream.Write(AData, Length(AData));
    UDPMemo.Lines.Add('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
    s := 'Replied from ' + UDPServer.Name + ' to "' + DataStringStream.DataString + '"';
    SetLength(data, Length(s)-1);
    move(s[1], data, Length(s)-1);
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, data);
  finally
    DataStringStream.Free;
  end;
end;
Der Compiler läuft jetzt fehlerfrei durch, aber wenn ich über den Client was schicke, kann ich noch kurzzeitg
am Server "wirre Zeichen" erkennen dann stürzt der Server ohne Fehlermeldung ab.

Gruß MarLe

Klaus01 17. Dez 2008 13:10

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Hallo,

leider kann ich das nicht testen.
Habe "nur" Indy 9 installiert.

Delphi-Quellcode:
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  s: String;
  data: TBytes;
begin
  DataStringStream := TStringStream.Create(''); // <-- hier Haltepunkt setzen
  try
    DataStringStream.Write(AData, Length(AData));
    DataStringStream.Position := 0;                // eventuell noch die Position auf 0 setzten
    UDPMemo.Lines.Add('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
    s := 'Replied from ' + UDPServer.Name + ' to "' + DataStringStream.DataString + '"';
    SetLength(data, Length(s)-1);
    move(s[1], data, Length(s)-1);
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, data);
  finally
    DataStringStream.Free;
  end;
end;
Irgendetwas passt nicht bei der Übergabe des Bytearray in den StringStream.
Wahrscheinlich kann man das so nicht lösen.


Delphi-Quellcode:
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var
  s: String;
  dataString: String;
  data: TBytes;
begin
  dataString:=String(pchar(AData))
  UDPMemo.Lines.Add('Received "' + dataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
  s := 'Replied from ' + UDPServer.Name + ' to "' + DataString + '"';
  SetLength(data, Length(s)-1);
  move(s[1], data, Length(s)-1);
  ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, data);
end;
.. so langsam gehen mir auch die Ideen aus.

Grüße
Klaus

MarLe 17. Dez 2008 13:28

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Hallo Klaus,

Du kennst dich ja sehr gut mit den Indy's aus, sollte ich nicht lieber gleich nur die Version 9 verwenden?
Wenn ja, wie krieg ich die Version 10 sauber los und die 9er rein ?

Oder gleich ohne Indy's nur mit den Sockets.
Ich brauch eigentlich nur einen einfachen Dienst der mir vom Server zyklisch eine Wert an alle angehängten Client's schickt.

Gruß MarLe

Klaus01 17. Dez 2008 13:57

Re: Indy 9 Sample - UDPClientServer - Delphi 6 -> 2006 ?!
 
Zitat:

Zitat von MarLe
Du kennst dich ja sehr gut mit den Indy's aus, sollte ich nicht lieber gleich nur die Version 9 verwenden?
Wenn ja, wie krieg ich die Version 10 sauber los und die 9er rein ?

Na, so gut auch nicht, ich schaue vielleicht ab und an mal in die Docu...
Wenn Du die Indy 10 deinstallieren willst, machst Du das so wie bei jeder anderen Komponente auch.
Wenn Du dir Indy 9 geladen hast, ist dort ein Package dabei welches Du installieren kannst.
Eine Installationsbeschreibung ist auch dabei.

Die Indy 9 würde ich verwenden, wenn ich schon Sourcen mit Indy 9 hätte und damit weiterarbeiten wollte.
Indy 10 ist für Delphi (win32) die Zukunft - also wenn Du dich jetzt damit beschäftigen willst ..

Zitat:

Zitat von MarLe
Oder gleich ohne Indy's nur mit den Sockets.

Die Entscheidung kann ich Dir nicht abnehmen.
Mit den Indys zu arbeiten vereinfacht einiges.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz