Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdIrc feststellen ob die verbindung noch da ist (https://www.delphipraxis.net/145806-idirc-feststellen-ob-die-verbindung-noch-da-ist.html)

DelTurbo 8. Jan 2010 17:18


IdIrc feststellen ob die verbindung noch da ist
 
Hi,

Ich benutze IdIrc (Indy 10) für meinen IrcClient. Es gibt ein flag .IsConnected. Das frage ich alle fünf sekunden ab. Wenn ich hier zuhause auf meinen unreal connecte und dann den unreal-server kille klappt es. Connecte ich aber ins Internet z.b. auf irc.iz-smart.net und fliege vom server (z.b. wegen 24h trennung oder ping-timeout) ändert sich das flag nicht.

Frage ich das falsche ab? Gibt es sonst noch eine möglichkeit festzustellen ob ich noch connected bin?

Danke im voraus

sx2008 8. Jan 2010 18:00

Re: IdIrc feststellen ob die verbindung noch da ist
 
Wenn zwei Rechner über TCP/IP verbunden sind und es werden keine Daten gesendet,
dann kann man das Netzwerkkabel rausziehen und keine Seite bekommt mit, dass die Verbindung eigentlich getrennt ist.
Erst wenn eine Seite Daten sendet, kann festgestellt werden, dass die Verbindung nicht mehr besteht.

Bezogen auf IRC würde ich dem regelmässig den PING-Befehl schicken.
(Mit PING meine ich nicht das übliche Ping sondern den Befehl im IRC-Protokoll)
Üblich sind 5Min nachdem die letzte Message empfangen wurde.
Wenn die Verbindung getrennt wurde, dann gibt es beim Senden des Befehls einen Fehler und du weisst dann, dass die Verbindung unterbrochen ist.

DelTurbo 8. Jan 2010 18:05

Re: IdIrc feststellen ob die verbindung noch da ist
 
Auf das Ping/Pong war ich auch gekommen. Allerdings kommt das ping nicht durch wenn man über einen BNC connected ist. Oder reden wir grad aneinander vorbei? :gruebel:

sx2008 8. Jan 2010 18:18

Re: IdIrc feststellen ob die verbindung noch da ist
 
Anstelle des PING-Befehls könntest du auch jeden anderen IRC-Befehl (z.B. VERSION) verwenden.
Es geht nur darum, dass du irgendwas über die bestehene IRC-Verbindung sendest.
Leider hat das IRC-Protokoll keinen NOP-Befehl (NO-Operation).
Daher bietet sich der PING-Befehl an.
Wie gesagt damit meine ich nicht Ping.

DelTurbo 8. Jan 2010 18:30

Re: IdIrc feststellen ob die verbindung noch da ist
 
Ich weiss schon welchen ping du meinst. Das ist er selbe ping wie er vom Server kommt. Da wird auch der client "angepingt" und antwortet mit einem pong. Kommt das pong nicht weiss der server das kein client mehr da ist.

Meines wissens wird aber mit dem ping der lag gemessen. Nun könnte man natürlich sagen 5 minuten lag kann nicht sein. Um das zu versuchen müsste ich wissen, an wen ich das ping wie senden muss. Kannst du mir das vielleicht noch sagen? Geht das mit IdIrc.Say? Wenn ja was muss drinne stehen? Wär super wenn du mir da "kurz" auf die sprünge helfen könntest.......

Danke

sx2008 8. Jan 2010 21:34

Re: IdIrc feststellen ob die verbindung noch da ist
 
Du kannst direkt IdIRC1.Ping(servername) aufrufen.
Optional kann man noch einen 2. Parameter übergeben, aber wozu das gut ist weiss ich nicht.

Astat 8. Jan 2010 22:45

Re: IdIrc feststellen ob die verbindung noch da ist
 
Zitat:

Zitat von sx2008
Wenn zwei Rechner über TCP/IP verbunden sind und es werden keine Daten gesendet,
dann kann man das Netzwerkkabel rausziehen und keine Seite bekommt mit, dass die Verbindung eigentlich getrennt ist.
Erst wenn eine Seite Daten sendet, kann festgestellt werden, dass die Verbindung nicht mehr besteht.

Hallo sx2008, IRC funktioniert über TCP, und wenn das Netzwerkkabel gezogen wird, wird der zugehörige Socket sofort
darüber benachrichtigt, dass die Verbindung unterbrochen wurde. Nur bei WANS mit mehreren Routern kann es vorkommen, wenn
zwischen diesen eine Verbindung gekappt wurde, dies der Netzwerkkarte nicht mehr mitgeteilt wird (Router Config).
Für diesen Zwecke kann man dem Socket sagen, dass dieser ein Keepallive verwenden soll.

Delphi-Quellcode:

setsockopt(ASocket, SOL_SOCKET, SO_keepalive, @bKeepAllive, SizeOf(bKeepAllive))
Ein Keepallive braucht in der Applikation nicht nachgebaut zu werden.


lg. Astat

sx2008 9. Jan 2010 14:10

Re: IdIrc feststellen ob die verbindung noch da ist
 
Zitat:

Zitat von Astat
und wenn das Netzwerkkabel gezogen wird, wird der zugehörige Socket sofort
darüber benachrichtigt, dass die Verbindung unterbrochen wurde.

Die Frage ist nur, ob das auch die Indy-Komponente mitbekommt.
Bei meinen Experimenten mit der ScktComp-Unit gab es keine Reaktion auf das Abziehen des Kabels.
Zitat:

Zitat von Astat
Für diesen Zwecke kann man dem Socket sagen, dass dieser ein Keepallive verwenden soll.
Delphi-Quellcode:
setsockopt(ASocket, SOL_SOCKET, SO_keepalive, @bKeepAllive, SizeOf(bKeepAllive))

Das ist natürlich auch eine Möglichkeit.
Dann wird aber der Systemdefault von 2 Stunden verwendet; d.h. 2 Stunden nachdem das letzte Datenpaket über die Verbindung geschickt wurde, werden automatisch Keep-Alive Pakete gesendet.
Über die Funktion WSAIoctl() kann man den Timeout ändern aber dann begibt man sich in die tieferen Bereiche von WinSock,
wo man sich eigentlich nicht die Finger schmutzig machen möchte.
Ausserdem sollte man dann auch mit einem Netzwerksniffer überprüfen, ob auch wirklich KeepAlive-Pakete gesendet werden.
Und zum Schluss bleibt noch die Frage, ob die Indy-Komponenten den fehlgeschlagenen KeepAlive Versuch mitbekommen.

Falls es funktioniert wäre das natürlich schön denn man braucht auf Applikationsebene und im Protokoll nichts tun.
Falls es nicht klappt, kommt man auf der Anwendungsschicht einfacher zum Ziel.

Astat 9. Jan 2010 17:25

Re: IdIrc feststellen ob die verbindung noch da ist
 
Zitat:

Zitat von sx2008
Über die Funktion WSAIoctl() kann man den Timeout ändern aber dann begibt man sich in die tieferen Bereiche von WinSock,wo man sich eigentlich nicht die Finger schmutzig machen möchte.

Hallo sx2008, aber dass ist ja genau der Vorteil gegenüber einer Black Box Componente, wo ohne zeitaufwändigem Studium, auftretende Probleme nicht zu beheben sind. Diese Zeiten in das einmalige Studium der Berkeley Socket API zu stecken, zahlt sich allemal aus.
Das Motto, dass unter "C" gilt, "ich weiss was ich tue", sollte doch auch unter Delphi und Konsorten gelten.
Naja, ich gebs ja zu, ich mag Komponenten nicht!

lg. Astat

Assertor 9. Jan 2010 17:37

Re: IdIrc feststellen ob die verbindung noch da ist
 
Hallo Astat,

Zitat:

Zitat von Astat
Hallo sx2008, aber dass ist ja genau der Vorteil gegenüber einer Black Box Componente, wo ohne zeitaufwändigem Studium, auftretende Probleme nicht zu beheben sind. Diese Zeiten in das einmalige Studium der Berkeley Socket API zu stecken, zahlt sich allemal aus.
Das Motto, dass unter "C" gilt, "ich weiss was ich tue", sollte doch auch unter Delphi und Konsorten gelten.
Naja, ich gebs ja zu, ich mag Komponenten nicht!

Dein gutes Recht, wobei Du dann in Delphi nicht viel Spaß haben wirst. Ökonomisch sinnvoll ist es auch nicht, das Rad immer neu zu erfinden. Für C++ gibt es ja auch die Boost Libraries... Also Daseinsberechtigung hat gerade Indy unter Delphi, da es die einzige native Sammlung von Komponenten zum Bereich TCP/IP ist.

Und "Black Box" ist da garnichts: Es ist OpenSource mit Source bei Delphi dabei, das nennt sich dann "White Box" (auch im Audit Bereich) ;)

Gruß Assertor

P.S.: Indy erfährt von Disconnects. Auch "Kabel-Ziehen". Gerade in dem Bereich habe ich Änderungen wegen des Next-Generation Stack für Vista, 2k8 und Win7 in OpenSSL eingebaut. Indy läuft ja nicht nur auf Delphi & Win, sondern Cross-Platform.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 Uhr.
Seite 1 von 2  1 2      

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