AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdIrc feststellen ob die verbindung noch da ist
Thema durchsuchen
Ansicht
Themen-Optionen

IdIrc feststellen ob die verbindung noch da ist

Ein Thema von DelTurbo · begonnen am 8. Jan 2010 · letzter Beitrag vom 9. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.192 Beiträge
 
Delphi 2007 Architect
 
#1

IdIrc feststellen ob die verbindung noch da ist

  Alt 8. Jan 2010, 17:18
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 8. Jan 2010, 18:00
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.
fork me on Github
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.192 Beiträge
 
Delphi 2007 Architect
 
#3

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 8. Jan 2010, 18:05
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?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 8. Jan 2010, 18:18
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.
fork me on Github
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.192 Beiträge
 
Delphi 2007 Architect
 
#5

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 8. Jan 2010, 18:30
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 8. Jan 2010, 21:34
Du kannst direkt IdIRC1.Ping(servername) aufrufen.
Optional kann man noch einen 2. Parameter übergeben, aber wozu das gut ist weiss ich nicht.
fork me on Github
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#7

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 8. Jan 2010, 22:45
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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 9. Jan 2010, 14:10
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 von Astat:
Für diesen Zwecke kann man dem Socket sagen, dass dieser ein Keepallive verwenden soll.
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.
fork me on Github
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#9

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 9. Jan 2010, 17:25
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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#10

Re: IdIrc feststellen ob die verbindung noch da ist

  Alt 9. Jan 2010, 17:37
Hallo Astat,

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.
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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