Entwickler-Ecke
Internet / Netzwerk - Serversocket/Clientsocket: Verbindung "sauber" beenden
Jojojoxx - Sa 07.01.06 19:43
Titel: Serversocket/Clientsocket: Verbindung "sauber" beenden
Hallo!
Ich habe ein Serverprogramm und ein Clientprogramm.
Wie muss eine erfolgreiche Abmeldung vom Server ablaufen, sodass auch socket.activeconnections den richtigen Wert enthält??
Weil das will bei mir nicht ganz funktionieren...
Worin genau liegt der Unterschied zwischen socket.close und socket.disconnect ??
Wenn ich vom Server die Verbindung duch Serversocket1.socket.connections[i].close schließen lasse, bliebt der Wert von
Serversocket1.socket.activeconnections unverändert und sinkt nicht um 1.
Danke euch!
mfg
Jojo
Moderiert von
raziel: Topic aus VCL (Visual Component Library) verschoben am Mo 09.01.2006 um 07:32
Muetze1 - Sa 07.01.06 19:53
Ich vermute das funktioniert alles richtig, aber du wartest nicht ab, bis der Socket geschlossen worden ist sondern erwartest direkt nach einem Disconnect/Close das ActiveConnections den richtigen (aktualisierten) Wert enthält. Daher würde ich gerne mal den Codeausschnitt sehen wo du den Socket schliesst bis zu dem Codeausschnitt, wo du eine aktualisierte ActiveConnections Eigenschaft benötigst.
Und grundlegend sollte man TCustomWinSocket.Close aufrufen.
Jojojoxx - Sa 07.01.06 19:58
Jep, du hast Recht!
Hab grad nen Timer auf 2 sek. gestellt und Serversocket1.socket.activeconnections überprüft und der Wert war korrekt.
Aber wann soll ich dann im Programm dies machen lassen? Ein Timer ist ja eine ziemlich schlechte Lösung.
Lässt sich irgendwie überprüfen, ob der Client disconnected und der Socket geschlossen ist?
mfg
Jojo
Muetze1 - Sa 07.01.06 20:05
Jojojoxx hat folgendes geschrieben: |
| Aber wann soll ich dann im Programm dies machen lassen? Ein Timer ist ja eine ziemlich schlechte Lösung. Lässt sich irgendwie überprüfen, ob der Client disconnected und der Socket geschlossen ist? |
Nach dem OnClientDisconnect Ereignis...
Was willst du überhaupt erreichen? Wenn du eine Liste mit Clients hast, dann füge Clients beim OnClientConnect in die Liste und lösche sie beim OnClientDisconnect. Dann hast du keine Probleme und brauchst ja ActiveConnections in dem Sinne überhaupt nicht mehr.
Also: was willst du grundlegend erreichen?
Jojojoxx - Sa 07.01.06 20:17
Also.... IM OnClientDisconnect-Ereigniss passiert nichts, der Wert ist der alte.
Jetzt hast du aber ja geschrieben NACH dem OnClientDisconnect-Ereignis, was meinst du damit?
Danke für deine Hilfe!
mfg
Jojo
Muetze1 - So 08.01.06 04:05
Ich habe geschrieben, das nach dem OnClientDisconnect Ereignis der Wert stimmt. Also wenn das Ereignis komplett abgearbeitet ist und auch das Ereignis fertig ist.
Und da es nach dem OnClientDisconnect nicht nochmal ein Event gibt, fragte ich nach, was du eigentlich erreichen willst. Wenn du es wie ich es geschrieben hatte mit dem OnClientConnect eine Verbindung vermerkst und beim OnClientDisconnect eine Verbindung entfernst, sollte es keine Probleme geben. Daher nochmals die Frage: Was willst du grundlegend erreichen?
Jojojoxx - So 08.01.06 13:44
Hi!
Ich will grundlegend erreichen, dass nach einem Disconnect eines Clients, alle anderen eine Nachricht erhalten.
Wenn ich aber ein Array anlege mit ID usw., dann müsste ich viel zu viel umprogrammieren.
mfg
Jojo
Narses - So 08.01.06 23:39
Moin!
Du kriegst doch im OnClientDisconnect den Socket mitgegeben, der rausfällt; sende einfach an alle anderen, nur nicht an diesen. :wink:
cu
Narses
Jojojoxx - So 08.01.06 23:46
Hi!
Wie bekomme ich den denn übergeben?? Wenn es so ist wie du sagst, wäre es die Lösung für mein Problem :D
mfg
Jojo
Narses - Mo 09.01.06 00:02
Moin!
Schau dir doch mal den Prozedurkopf an... :roll: :wink:
cu
Narses
Jojojoxx - Mo 09.01.06 00:05
Moin auch :lol: !
Hab ich vor meiner Antwort eben schon gemacht:
Delphi-Quelltext
1: 2:
| procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); |
Sehe da keine Variable, in der der Client stehen könnte :(
mfg
Jojo
Narses - Mo 09.01.06 00:16
Moin!
Preisfrage (1 Gummipunkt): Von welchem Typ ist das .Connections[]-Array im ServerSocket? :D
cu
Narses
Jojojoxx - Mo 09.01.06 00:21
Hi!
Würd ja gerne den Publikumsjoker nehmen, aber leider ist hier kein Publukum :D
Also,.. Der Wert, der übergeben werden muss, MUSS ja vom Typ Integer sein (richtig?)!
Aber wie greife ich darauf zu?!? :( Sorry, wenn ich mich grad was dumm anstelle, aber ich
finde die Lösung nicht! :?:
mfg
Jojo
Narses - Mo 09.01.06 00:31
Moin!
OK, vielleicht war die Frage ja tatsächlich missverständlich gestellt, also nochmal:
Welchen Typ haben die Elemente im .Connections[]-Array (NICHT der Index, das ist ein Int, schon klar) des Server-Sockets?
cu
Narses
Jojojoxx - Mo 09.01.06 00:50
Hi!
Ich steh völlig auf´m Schlauch :? ...
mfg
Jojo
Jojojoxx - Mo 09.01.06 01:02
Ahhhh!!! :-)
Du meinst als, ich soll mit
Delphi-Quelltext
1: 2: 3:
| for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do if Socket = ServerSocket1.Socket.Connections[i] |
überprüfen, wer der Client ist, der disconnected und dann allen außer diesem eine Nachricht senden!?
mfg
Jojo
Narses - Mo 09.01.06 01:12
Moin!
Genau, und wenn du statt = noch <> nimmst, dann hast du den nötigen Code doch praktisch fertig. :wink:
Das war aber ein schwieriger Gummipunkt... :D
cu
Narses
Jojojoxx - Mo 09.01.06 01:21
Narses hat folgendes geschrieben: |
Das war aber ein schwieriger Gummipunkt... :D
|
Aber immerhin hab ich ihn bekommen! :wink:
Vielen Dank für deine Geduld und Hilfe!! :D
mfg
Jojo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!