Autor Beitrag
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 25.08.05 15:13 
Hallo allesamt,

lange hat´s gedauert, aber nun ist es soweit, die Portierung der TSimpleTCP-Komponenten auf Indy 10 ist geschafft.

Für eine Beschreibung der Komponenten klicke hier.

Im Anhang befindet sich die Unit sowie eine kleine (häßliche, aber funktionierende) Demo.

2006-03-01: Neue Version eingespielt, Quellcode als nun als Anhang.

Cu,
Udontknow
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Udontknow am Do 26.04.07 17:25, insgesamt 2-mal bearbeitet
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 31.08.05 12:32 
Hallo!

Die neueste Version behebt einige Probleme mit Zugriffsschutzverletzungen beim Schliessen von Anwendungen:

Wurde die Client- oder Serverkomponente in einer Anwendung nicht vor deren Beendigung geschlossen, sodaß der Destruktor der SimpleTCP-Komponenten die Verbindungen schliesst, kommt es u.U. zu Accessviolations, da die Events der Komponenten noch immer ausgelöst wurden. Wenn man im Event OnDisconnect beispielsweise in einem Memo das vermerkte, war dieses Memo (je nach Erstellungsreihenfolge in der DFM) möglicherweise schon nicht mehr existent.

Events werden nun nicht mehr ausgelöst, wenn die Komponente csDestroying im ComponentState enthält. Sollen also bei Beendigung des Programms unbedingt noch die Events ausgelöst werden, muss die entsprechende SimpleTCP-Komponente vorher "manuell" geschlossen werden (bspw. im FormClose etc.).

Cu,
Udontknow
Fettlaus
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 29.09.05 00:53 
Hi Udontknow,

Ich find deinen Wrapper echt klasse, zumal ich in Delphi noch nicht all zu bewandert bin. Leider kam ich noch nicht dazu, ihn zu benutzen:

Ich habe versucht, den Wrapper zu benutzen, aber bin prompt auf einen Fehler gestoßen.
Und zwar bekomme ich eine "Access Violation" beim setzen des Ports.
Das Programm habe ich erstmal noch nicht weiter entwickelt, aber hier der Quelltext bis jetzt:
ausblenden volle Höhe Delphi-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:
unit UChat;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SimpleTCP, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Server: TSimpleTCPServer;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if (StrToInt(Edit1.Text)<65535or (StrToInt(Edit1.Text)>1024then begin
Server.Port:=StrToInt(Edit1.Text);
Server.Active:=true;
end
else
begin
Showmessage('Du musst einen  Port zwischen 1024 und 65535 angeben')
end;
end;

end.
Und an genau dieser Stelle bleibt er hängen(Zeile 3):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TSimpleTCPServer.SetPort(const Value: Integer);
begin
  FServer.DefaultPort:=Value;
end;

Ich habe irgendwie die Befürchtung, das ist ein ganz blöder Anfängerfehler und ihr könnt mir schnell und schmerzlos helfen :(
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 29.09.05 08:31 
Hallo!

Das klingt sehr merkwürdig. Hast du die Unit auch in ein Package gesteckt und dieses installiert, sodaß du die Serverkomponente wie einen Button aus der Komponentenliste aufs Formular packen kannst? Oder hast du einfach nur die Unit in der uses-Klausel aufgenommen und die Variable Server von hand eingetragen?

Prüfe mal, ob die Serverkomponente auch wirklich erstellt wurde:

ausblenden Delphi-Quelltext
1:
2:
if Server=NIL then
  showMessage('Diese Variable ist nicht initialisiert!');


Cu,
Udontknow
Fettlaus
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 29.09.05 10:10 
Ich sag ja, wird sicher ein Anfängerfehler sein...
Vielen Dank für die schnelle Hilfe, klappt alles einwandfrei bisher.
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Di 15.11.05 19:27 
Bei der alten Version war es so, dass Active als Eigenschaft im Objektinspektor definiert war, jetzt gibt es sie dort nicht mehr. Warum? :?

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Passi077
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Do 26.01.06 18:54 
Hi,

ich hab ein Problem beim installieren.. und zwar hat findet er die folgenden Komponenten nicht? :

uses Classes, Windows, SysUtils, SyncObjs, idGlobal, idContext, IdTCPClient,
IdTCPServer, IdSchedulerOfThread, IdStreamVCL, idIOHandler, Dialogs;

WIe kann ich das behen?

Danke + Grüße
Passi
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 26.01.06 19:15 
Hast du Indy 10 denn installiert? By D7 ist noch das alte Indy dabei...

Cu,
Udontknow
Passi077
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Do 26.01.06 19:58 
Oha, kein Wunder Oo

Aber es funktioniert leider trotzdem nicht, beim Kompilieren erkennt er jetzt "TIDStreamVCL" nicht (undefinierter Bezeichner..)

?
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 26.01.06 20:20 
Hast du einen entsprechenden Bibliothekspfad in den Optionen angegeben, der zu den PAS-Dateien von Indy führt?

Cu,
Udontknow
Xantor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 24.02.06 12:33 
Ich arbeite noch mit der alten Komponente - hab aber damit ein Problem. Und zwar sende ich 25 mal pro Sekunde ein kleines Datenpacket(6 Bytes) vom Server an die Clients, diese aber erhalten nicht 25 einzelne Nachrichten, sondern nur rund 5 mal pro Sekunde einen packen aus 5 Nachrichten. Das ist aber nicht das, was ich brauche. Habe auch schon die Priorität des Client-Threads hoch gesetzt, aber das bringt nichts.

Frage: Könnte das mit der dieser neuen Version besser klappen?
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 24.02.06 18:30 
Öh, bei den alten war nichts wesentlich anders, da wurde auch schon immer ein Receive-Ereignis pro Sendung ausgelöst...

Bist du sicher, daß du die SimpleTCP-Komponenten von mir genutzt hast?

Cu,
Udontknow
Xantor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 24.02.06 20:01 
Da bin ich mir ganz sicher :)

Aber so wie du schreibst, gehe ich davon aus, das du selber irritiert bist - also mir kommt das ja auch komisch vor. Ich werde noch mal genauer nach der Ursache forschen. Bei der Gelegenheit hab ich noch eine Frage: Wie groß glaubst du ist die Lantenz-Zeit zwischen absenden der Message vom Server und des eintreffens bzw. auslösen des Ereignises beim Client. Natürlich keine Last - also Idealzustand. Genau brauch ich es nicht, aber wenn es viel größer als 10ms ist, dann muß ich mir sowieso was anderes überlegen, da ich die Rechner synchronisieren will.
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: So 26.02.06 15:23 
Tja, also die Komponente basiert nunmal auf TCP, und TCP ist nicht dafür bekannt, eine gute Latenz zu erreichen. Ich habe das ganze mal mit einem "Ping" versehen, es waren so um die 300 ms, die in einem lokalen(!) Netz auftauchen können.

Das ganze müsste dann über UDP konzipiert werden, aber da hast du dann auch wieder Nachteile (begrenzte Grösse der Datenmenge, keine Sicherheit, daß Pakete ankommen, etc.).

Cu,
Udontknow
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 01.03.06 10:27 
Titel: Neue Version 1.0.1.3
Hallo allesamt,

habe die Unit nun als Anhang im ersten Post eingefügt, es ist ausserdem noch ein Fehler behoben worden, der bei Verbindungsabbrüchen auf Clientseite dazu führen konnte, daß der Client weder die Verbindung ordentlich lösen noch neu herstellen konnte ('Connection reset by peer').

Bis dann,

Andreas
Xantor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mi 01.03.06 14:57 
Danke für deine Bemühungen - ich werde aber erst nächste Woche dazu kommen das auszuprobieren. Außerdem werd ich mal die 2 UDP-Komponenten von Indy testen, ob sie auch dieses (für mich) merkwürdige Verhalten zeigen. Als "Ass im Ärmel" hab ich dann immer noch MIDI. Das hat ein sehr gutes Latenzverhalten - garantiert unter 10ms für die paar Byte die ich da versende. Möglicherweise gibts für das ganze Problem ja auch eine völlig andere Erklärung und ich hab sie nur noch nicht gefunden.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 01.03.06 15:13 
Moin!

Wenn du so knallhart am Puls-des-Netzes sein willst :wink:, dann darfst du eh keine asynchrone Benachrichtigung verwenden, sondern solltest blocking-socket-calls machen und mit einem Listener-Thread arbeiten!

Falls du nicht auf die Indies angewiesen bist/sein möchtest, gibt´s hier noch eine Alternative. :wink:

cu
Narses
redjustice
Hält's aus hier
Beiträge: 3

Win XP x64
Delphi 2005 Arch.
BeitragVerfasst: Sa 19.08.06 12:38 
Hey udontknow!

Wollte mich bei dir kräftig bedanken!
Deine Indy-Wrapper haben mich sehr viel weitergebracht.

Kurz nebenbei:
Kann ich irgendwie einen Datentransfer abbrechen?

Wird es eigentlich auch irgendwann ein SimpleUDP für Indy 10 geben?

MfG red
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 22.08.06 17:50 
Hallo!

Zitat:
Wollte mich bei dir kräftig bedanken!
Deine Indy-Wrapper haben mich sehr viel weitergebracht.


Das höre ich gerne!

Zitat:
Kann ich irgendwie einen Datentransfer abbrechen?

Nein. Um den Datentransfer abzubrechen, müsste ich noch stark aufbohren, es müssten zwischendurch immer wieder Steuer-Informationen gesendet und interpretiert werden. Da ich aber aufgrund eines Jobs, der mich sehr auslastet, kaum die Zeit finde, wird das nix...

Zitat:
Wird es eigentlich auch irgendwann ein SimpleUDP für Indy 10 geben?

Auch hier leider nein, keine Zeit. Ich hatte mal so etwas gemacht für Indy 9, aber es hat nie so richtig gut geklappt, und irgendwie habe ich es nie für Indy 10 ans Laufen gekriegt.

Cu,
Udontknow
oern
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 142

Linux, Win XP
D7
BeitragVerfasst: Di 10.10.06 19:20 
Eine wunderschöne TCP Komponente :D Funktioniert einwandfrei :)

Was nur etwas störent ist ist die Exception "Disconnected." Beim Beenden des Servers die würde ich gerne beseitigen.

Ansonsten tolle arbeit, danke für die Unit :D

mfg, Björn

_________________
Ich hab eine Signatur