Autor Beitrag
reimo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: Mo 08.03.04 14:37 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 303

W2k,WinXP
D3 - DXE3 Enterprise
BeitragVerfasst: 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.

_________________
Viele Wege führen nach Rom.
reimo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 303

W2k,WinXP
D3 - DXE3 Enterprise
BeitragVerfasst: 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

_________________
Viele Wege führen nach Rom.
reimo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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