Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - IP-Verbindungsfehler erkennen (TClientSocket)
reimo - Mo 08.03.04 14:37
Titel: IP-Verbindungsfehler erkennen (TClientSocket)
Hi,
wie kann ich clientseitig (TClientSocket) erkennen, dass die Verbindung zum Server getrennt worden ist (zB.: Netzwerkkabel beim Server abgesteckt)?
sollte nicht das OnDisconnect - Event ausgelöst werden? (tut es aber nicht)
trenne ich die Verbindung (Netzwerkkabel vom Server abgesteckt) und verschicke ein Packet vom Client zum Server, so wird auch kein Fehler gemeldet. Als return-Wert von SendBuf wird die Anzahl der versandten Bytes geliefert, sollte nicht ein Fehler gemeldet werden? wie kriege ich das hin, dass ich erkennen kann, dass die Verbindung nicht mehr vorhanden ist?
thx
reimo
G-McKree - Mi 10.03.04 00:40
dann lass doch einfach den server immer ein 'ich bin da signal' schicken oder 'ich hab das packet bekommen' es geht wohl auch anders, aber das is sicher die einfachste methode
reimo - Mi 10.03.04 08:51
Zitat: |
dann lass doch einfach den server immer ein 'ich bin da signal' schicken oder 'ich hab das packet bekommen' es geht wohl auch anders, aber das is sicher die einfachste methode |
geht leider nicht, da der server nicht von mir ist.
ich hab mir gedacht, dass ich den server zyklisch anpinge, was auch funktioniert, bis auf die Kleinigkeit, dass ich für die Indy-Ping-Komponenten (TIdIcmpClient) als administrator eingeloged sein muss. Weiss vielleicht jemand, wie ich diese Einschränkung umgehen kann?
Es kann ja nicht sein, dass ich den ping nur als Administrator wegschicken kann?
Ich hab auch irgendwo gelesen, dass es soetwas wie ein TCP-Timeout gibt. Wie kann ich diesen nutzen (mittels TClientSocket)?
thx
reimo
MAlsleben - Mi 10.03.04 09:08
Hi,
mit der Indy-Ping Komponete das habe ich auch schon festgestellt und nachgelesen. Die funktioniert nur unter Adminrechten, weil diese nicht auf Winsock aufsetzen, sondern auf RAW-Sockets.
Wenn Du in der Delphi Hilfe mal nach Timeout suchst, findest Du dort etwas unter TWinSockStream und bei TWinSockStream.read ist ein Beispiel wie ich denke für Dein Problem vorhanden.
Gruß Micha.
reimo - Mi 10.03.04 11:07
ok, danke werde mir das Beispiel genauer anschauen (der erste versuch ist jedenfalls gescheitert)
wie sieht es eigentlich mit dem Ping aus, weiss jemand, wie ich diesen abschicken kann, ohne als Admin eingeloged zu sein (mit oder ohne Indy)?
reimo - Mi 10.03.04 12:17
Hi,
die Lösung über WaitForData (Bsp in TWinSockStream.read ) funktioniert leider nicht! diese Funktion ruft nichts anderes als select() auf, welches nur überprüft, ob die connection zum Server aufgebaut wurde, nicht aber, ob diese immer noch besteht.
thx,
reimo
MAlsleben - Mi 10.03.04 17:15
Hi,
Delphi Hilfe zu TWinsockStream.Timeout schreibt noch:
Zitat: |
Die Eigenschaft TimeOut gibt die Zeit in Millisekunden an, die der Socket-Stream warten sollte, bevor ein Lese- oder Schreib-Aufruf wegen einer Zeitüberschreitung abgebrochen wird.
property TimeOut: Longint;
Beschreibung
Setzen Sie TimeOut auf die Zeit, die abgewartet werden soll, bevor eine Lese- oder Schreiboperation mit der Annahme, daß die Socket-Verbindung fehlgeschlagen ist, abgebrochen wird. |
Vielleicht mußt Du diese Eigenschaft noch setzen?
Gruß Micha
reimo - Do 11.03.04 09:20
hi,
dies funktioniert aber nur, wenn die socketverbindung ansich noch nicht aktiv ist.
das heisst Clinetsocket.Active = false, bzw. Clientsocket.Socket.Connected = false.
Im Falle von Clientsocket.Socket.Connected = false läuft das Timeout ab, und da die Connection false ist, wird ein Fehler gemeldet.
Im Falle einer Verbindungsunterbrechung zum Server funktioniert dies aber nicht:
1. Connect zum Server (Clientsocket.Socket.Connected = true)
2. Daten verschicken: Cleint -> Server-> OK
3. Netzwerkkabel vom Server abziehen (Clientsocket.Socket.Connected ist immer noch true)
4. Daten verschicken: Client -> Server -> OK (das Timeout läuft nicht ab, die Daten werden erfolgreich verschickt, obwohl der server nicht da ist) -> das ist mein Problem, wie erkenne ich das
naja, versuche gerade den ping selbst zu implementieren
danke für die Hilfe
reimo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!