PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB TcpClient Disconnect erkennen



Hu5eL
19.06.2010, 18:39
Hallo alle zusammen
ich hab ein Problem mit Vb.Net und TcpClients...
und zwar würde ich gerne, wie der Title schon sagt, Disconnects erkennen.
Es geht nicht darum, wie ich ne Verbindung "richtig" schließe, sondern wie kann ich sinnvoll erkennen ob mein Gegenüber bzw der Client sich einfach beendet hat. Maybe kill per taskmanager oder einfach ausschalten des pcs (strom direkt aus).

tcp.connected zeigt den status ja nur ahand der letzen aktion (send recive)
zuerst dachte ich mir, ich schicke einfach einen leeren string, bzw 0 bytes über die verbindung.
doch das scheint nicht so ganz zu klappen.
Wie löst ihr das problem?

Gruß Hu5eL

berlinermauer
19.06.2010, 18:54
1. Warum klappt das nicht?

2. Versuche doch mal ein senden eines "PING" an alle Clients
Dann warte nen paar sekunden, und mach 2 Arrays, und zwar die die die clients beinhalten.
Und dann wenn ein pong kommt, halt in das 2.te Array, und vergleiche welche clients nicht antworten.

Denn onDisconnect findet nur bei nem Guten Disconnect statt.

Gibt es nicht etwas ala sub TCPListener.OnDisconect(byVal blah)?

krusty
19.06.2010, 19:11
es gibt in vb.net keine ereignisse für die tcp klasse.
ich habe das ganze so gemacht. du hast aj sicherlich irgendwo ne schleife, in der du den networkstream ausließt, um daten zu empfangen. sobald der client oder server off geht, ist der stream down und es kommt zu einem fehler. in einem try catch block kannste dir den fehler abfangen und dann weißt, dass der client/server off ist.

S1024
19.06.2010, 19:35
Hi,

Entweder das was Krusty vorschlägt, oder wenn du über einen Disconect Butten etc verfügst schicke einfach sowas wie "@Server_Me_Disconect". Beim Server einfach ne If Abfrage einbauen die nach diesem Befehl fragt.

Grueße
DieVar

Hu5eL
19.06.2010, 19:52
s1024 es ging darum wie ich erknne das der client sich nicht richtig ausgeloggt hat

meine idee: ein thread, der einfach alle x sekunden nacheinander die clients durchgeht und ein ping hinsendet. jetzt das problem:

mainprogramm sendet: "whois" (client soll also mit seinem namen antworten)
mainprogramm wartet auf antwort (liest vom stream)
dann sendet mein thread sowas wie: "ping"
thread wartet auf antwort (liest auch vom stream)

wenn jetzt ne antwort kommt, wie kann ich das dann unterscheiden, wer die antwort lesen soll?
eigentlich solllte ja wieder pong zurückkommen

was aber ist, wennn

krusty
20.06.2010, 00:11
ich hab ein tut gemacht über multiconnection in vb.net, findeste in der vb.net tut sektion.
wennde hilfe brauchst icq per pn an mich.
du solltest eine eigene client-klasse entwerfen und dann alle verbundenen clients in einer liste abspeichern.

Hu5eL
20.06.2010, 18:35
wie ich schon sagte: das ist nicht das problem.
ich kann mehere client aufnehmen und auch wieder "ansprechen".
jetzt würde ich gern in einer art "ping"-methode zyklisch testen ob noch alle ereichbar sind. die umsetzung ist auch nicht schwer. ich starte einfach einen thread, der die liste der clients durchgeht und nacheinander einen ping sendet und auf das pong wartet.

dadurch das ich die methode in einem neuen thread starte kann es ja vorkommen das:
hp = hautprogramm t1 = thread für der den ping sendet, c1 = ein client

1: hp sendet sowas wie "sag mir deine ip" an c1 und lauscht auf dem stream um die antwort entegenzunehmen
2. t1 sendet gleichzeitigt zu c1 "ping" und lauscht natürlich auch.
3. c1 client antwortet auf den pingbefehl.

Da entsteht das problem: woher weis ich auf was er zuerst antwortet etc..

jetzige lösung. eine eigene tcpclient-klasse, die die send und recive funktionen per binäre semaphore schützt..