Autor |
Beitrag |
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
|
Verfasst: 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: 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 public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin if (StrToInt(Edit1.Text)<65535) or (StrToInt(Edit1.Text)>1024) then 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): 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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:
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
|
Verfasst: 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
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: 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
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 26.01.06 19:15
Hast du Indy 10 denn installiert? By D7 ist noch das alte Indy dabei...
Cu,
Udontknow
|
|
Passi077
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 21
|
Verfasst: 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 21
|
Verfasst: 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 21
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 01.03.06 15:13
Moin!
Wenn du so knallhart am Puls-des-Netzes sein willst  , 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.
cu
Narses
|
|
redjustice
Hält's aus hier
Beiträge: 3
Win XP x64
Delphi 2005 Arch.
|
Verfasst: 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 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 142
Linux, Win XP
D7
|
Verfasst: Di 10.10.06 19:20
Eine wunderschöne TCP Komponente  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
mfg, Björn
_________________ Ich hab eine Signatur
|
|