![]() |
Problem bei Überprüfung ob Client Online ist! IndyTCP
habe ein Problem mit der IndyTCPclient Komponente. Ich lasse mit einer For-Schleife Verbindungen zu Servern aufabeun. Fals der Server online ist wird die ip in eine TreeNode von einer Treeview eingetragen. Mein Problem ist das das Programm ohen Fehlermeldung abstürzt sobald ein Server Offline ist. Hier der Code:
Delphi-Quellcode:
Ich bedanke mich schonm,al im vorraus für die Hilfe.
procedure TfrmMain.Timer1Timer(Sender: TObject);
var i :integer; var Kontakte : array of ttreenode; begin setlength(kontakte,table1.RecordCount); tree2.Items.Clear; tree2.items.add(nil,'Online'); tree2.items.add(nil,'Offline'); pb1.max := table1.recordcount; pb1.visible := true; table1.First; for i:= 0 to table1.recordcount -1 do begin pb1.position := i; GeneralC.host := table1.fieldbyname('IP').text; try GeneralC.Connect; GeneralC.Disconnect; kontakte[i] := tree2.Items.AddChildFirst(tree2.Items.Item[0],table1.fieldbyname('Name').Text); //0 ist online tree2.FullExpand; except; //1 ist Offline kontakte[i] := tree2.Items.AddChildFirst(tree2.Items.Item[1],table1.fieldbyname('Name').Text); tree2.FullExpand; end; if not table1.Eof then table1.Next; end; pb1.visible := false; end; Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Hi,
erstmal würde ich den Connect mit einem Timeout versehen !
Code:
Zweitens, würde ich Dir dringenst empfehlen am am Anfang deiner Procedure den Timer auszuschalten und am Ende der Procedure den Timer wieder anzuschalten, vielleicht das ganze durch nen Try Finnally Block sichern.
GeneralC.Connect(5000); // 5 Sekunden
Dann würde ich hingehen und Deinen Code etwas optimieren :
Code:
Desweiteren würde ich mir noch Deinen "Online" und Deinen "Offline" Node in einer temporären Var speichern und nicht mit Item[0] und Item[1] arbeiten.
// .....
try GeneralC.Connect(5000); // Timeout 5 Sek. except // just catch the exception end; if GeneralC.connected then begin // save disconnect try GeneralC.disconnect; except // just catch it end; kontakte[i] := tree2.Items.AddChildFirst(tree2.Items.Item[0],table1.fieldbyname('Name').Text); end else begin // Offline kontakte[i] := tree2.Items.AddChildFirst(tree2.Items.Item[1],table1.fieldbyname('Name').Text); end; end; // end vom For if tree2.items.item[0].ChildCount > 0 then tree2.items.item[0].Fullexpand; if tree2.items.item[1].ChildCount > 0 then tree2.items.item[1].Fullexpand; Gruß Data |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Ja aber das ist nicht wirklich ne Lösung für das Problem. Das iss ja im Mom noch Quick and Dirty!
Frage ist ja warum das abstürzt und das hat nix mit dem Timeout zu tun. Ist ja schön und gut das du da was optimierst aber damit ist mir nicht wirklich geholfen! Trotzdem vielen dank! Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Hi,
hast du das ganze mal debugged ? Wo knallt er denn ? Auf Anhieb ist mir von der Logik nämlich nix aufgefallen, ausser das der timer doppelt eintreten könnte. Gruß Data |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
hi,
der Timer tritt erst nach 30seks wieder ein (Also kein Doppel). Der Debugger gibt keine Fehler aus! Das Programm bleibt einfach hängen. Ka worans liegt! Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Hi,
und was passiert, wenn du ohne Timeout connectest ? Meinst du nicht das könnte 30 sek. dauern ? und dann haste das was ich gesagt habe doppelter Timer ;-) Gruß Data P.S.: Bleibt einfach hängen könnte auch passieren, wenn DU kein IdAntifreeze auf der Form hast |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Ja wenn der Timer den Fehler verursachen würde dann würde es ja auch nicht bei den Kontakten funitionieren die Onlinen sind. Da diese aber funktionieren kanns daran ja nicht liegen!
Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Hi,
bei den online Kontakten bekommst du nen connect und musst nicht länger als den Timer-Intervall warten ! GRuß DAta |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Also du meinst das so:
GeneralC.connect(Timeout...) wenn der connected hast ja keinen Timeout. wenn der nicht online ist dann Timeout... Geht der das dann trotzdem in den Except Teil??? Snaky PS: bin grad in der schule und kann das nicht ausprobieren trotzdem Daneke Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Mal ne andere Vermutung:
Wenn du das Programm aus der Delphi-IDE heraus startest knallts immer. Probiers mal so zu starten. Aber irgendwie finde ich die Lösung auch nicht schön. Wenn du nur im LAN connecten willst solltest du dir mal UDP-Broadcasts ansehen. im Inet könntest du alle IP's auch etwas bequemer durchgehen und du bräuchtest nichtmal einen try-except Block. Gruß Christian |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Also danke für den Tip aber das ist egal ob aus der ide oder mit der kompilierten exe...
zu deinem Tip mit UdP: Wie erwähnt geht es sich hierbei um eine facharbeit. Ich muss TCP/IP benutzen für spätere Messungen von traffic usw... Trozdem vielen daNk! :cheers: |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Das hinterher über TCP zu machen ist auch sinnvoll, aber das Finden von Servern würde ich mit UDP machen. Finden die Messungen denn im LAN statt?
Gruß Christian |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Ja finden sie. Ich will / muss auf jeden Fall das über das TCP/IP protokoll machen. Und die Lösujng ist ja auch eigentlich total logisch. Sber wieso schmiert dr ohne Fehlermeldung ab!!??? Naja vielleich fältt ja noch einem was ein. Ach ja das mit dem timeout hat auch nicht geklappt
|
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Hi,
da mir ja scheinbar keiner helfen kann (was ich niemandem verüble!*g*), könnte mir da jemadn erklären wie das udp Broadcasting auf mein Beispiel anwendbar wäre? Snaky :wall: |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Snaky,
die Sache ansich mit TCP/IP funktioniert. Hab gerade mal einen Minitest gemacht. Ich weiß ja nicht wie groß der IP-Bereich ist den du durchsuchst, aber vielleicht musst du auch nur die Komponente IdAntiFreeze auf die Form ziehen. Kannst dir ja mal meinen Test ansehen. Projekt1 ist der Client und Projekt2 der Server. PS.: Vergiss nicht evtl. Host und Port an dein LAN anzupassen. :wink: //Edit: Trenn vielleicht auch bei dir mal Datenbank-Abfrage und das Suchen nach Servern. Lade alle zu prüfenden IPs in eine Stringlist und speichere sie, um zu überprüfen ob auch wirklich IPs aus der DB kommen. Erst dann gehts du wie gehabt mit der Prüfung durch, nur das du die IPs aus der Stringlist lädst. MfG Christian |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Danke für dein Beispiel...also mit der Datenbank ist alles richtig...sind nur 2 IP Adessen zum test. Eine ist auf jeden Fall online. Der andere ist Oflline.
Muss ich bei Antifreeze irgend welche besonderen Einstellungen treffen das der auf die bestimmte Komponente zugeschnitten ist? gruß und vielen Dank Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Vielen Dank für die Müh. Werde es gleich mal ausprobieren. Also an der Datenbank liegt es definitiv nicht. Die Benutz ich auch in anderen Teilen und außerdem hab ich mir die Einträge vor dem connecten ausgeben lassen und das passt alles... Werd mich gleich noch mal melden mit derm Ergebnis. Aber was meintest du mit dem Antifreeze bzw wie muss ch das einstellen damit das auch auf die spezielle indy-komponente reagiert oder ist das allgemein?
vielen Dank gruß, Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Also ich hab dein Beipiel gerade auf mein Progyy angewandt und ich bekomm bei 'Online' Benutzern Resonanz. Bei Oflline einen Fehler wegen Zeitüberschreitung [EIDTimeout]Fehler. Also in sofern Erfolg das ich wenigstens ne Fehlermelkdung bekomme.
Kann mir jetzt mit dem Fehler weiterhelfen? Hier noch mal de Code:
Delphi-Quellcode:
Danke im Vorraus
procedure TfrmMain.Timer1Timer(Sender: TObject);
var i :integer; var Kontakte : array of ttreenode; begin timer1.enabled := false; setlength(kontakte,table1.RecordCount); table1.First; for i := 0 to length(kontakte) -1 do begin try generalc.Host := table1.fieldbyname('IP').Text; generalc.Connect(2000); if generalc.Connected then begin generalc.Disconnect; showmessage('Verbunden mit ' + generalc.Host); end; except generalc.Disconnect; showmessage('Host ' + generalc.Host + ' nicht erreichbar!'); end; if not table1.Eof then table1.next; timer1.enabled := true; end; Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Ich habs...
Der eben gepostete Code funktioniert. Allerdings nur kompiliert. In der IDE nicht. Hab ich vergessen nochmal auszuprobieren nachdem mein alter Code es nicht tat (kompiliert und in der ide). Vielen Vielen Vielen Dank an euch Snaky |
Re: Problem bei Überprüfung ob Client Online ist! IndyTCP
Kein Problem, gern geschehen.
Zu IdAntifreeze: Einfach draufziehen reicht. Zur IDE: Die IDE hebelt den try-except Block immer aus. Jedenfalls mit den Standardeinstellungen. Gruß Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz