![]() |
Namen erscheinen gehen aber nicht weg
Hey,
Zu meinem Problem, von meiner Nickliste in meinem Chat. Durch folgenden Code werden die Clients aufgelistet
Delphi-Quellcode:
Und beim Client so
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket); var voice: OLEVariant; begin label1.Caption := ServerSocket1.Socket.Connections[Listbox1.Items.Count].RemoteAddress; Listbox1.Items.Add(label1.caption); memo1.Lines.Add('Neuer Client hat sich verbunden : '+label1.caption+' .'); mediaplayer1.FileName := 'Sounds/connect.wav'; mediaplayer1.Open; mediaplayer1.Play; end;
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin if (ClientSocket1.Socket.Connected = false) then begin ClientSocket1.Active := true; end else begin timer1.Enabled := false; end; end; OnClientdisconnect :
Delphi-Quellcode:
Nur wenn der Client das Programm offen lässt und z.B einfach den Computer herunterfährt, bleibt der Client in der Liste obwohl er garnichtmehr verbunden ist.
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket); begin bitbtn2.Click; listbox1.Items.Clear; bitbtn2.Click; ServerSocket1.Active := false; bitbtn2.Click; ServerSocket1.Active := true; bitbtn2.Click; bitbtn2.Enabled := false; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin SelectedVictim := -1; Memo1.Lines.Add('Verbindung getrennt mit : '+label1.Caption+' .'); end; Gibt es da noch eine Funktion ala Timeout , oder wie kann mann sich da behelfen? Mit freundlichen Grüßen, luckys41 |
Re: Namen erscheinen gehen aber nicht weg
Clients anpingen.
Und gewöhn dir bitte 'ne ordentliche Code-Formatierung an! *schauder* :pale: |
Re: Namen erscheinen gehen aber nicht weg
Soweit so gut.
Server : :cheers:
Delphi-Quellcode:
Client :
procedure TForm1.Timer1Timer(Sender: TObject);
var i:Integer; begin with ServerSocket1 Do begin for i:=0 to Socket.ActiveConnections Do begin Socket.SendText('PING'); end; end; end;
Delphi-Quellcode:
Und wie kann ich jetzt die Nachricht Off verarbeiten beim Server?
if str = 'Ping' then
begin Socket.SendText('PONG'); end else begin Socket.SendText('Off'); end; |
Re: Namen erscheinen gehen aber nicht weg
Server pingt - Client antwortet : alles OK
Server pingt - Client antwortet nicht : Ups, da ist wohl wer offline, den nehm ich mal aus der Liste raus. |
Re: Namen erscheinen gehen aber nicht weg
Dankeschön für die Antworten.
Aber könnt ihr mir vielleicht einen Code Schnipsel zeigen wie sowas beim Server geht? |
Re: Namen erscheinen gehen aber nicht weg
Mit Code-Schnipsel ist das schwer abzuhandeln.
Du brauchst ein Zeitfenster, in der der Klient antworten muss. Wird es überschritten, kann man davon ausgehen, dass der Klient off ist. |
Re: Namen erscheinen gehen aber nicht weg
Hab es jetzt so
Delphi-Quellcode:
Client :
procedure TForm1.Timer1Timer(Sender: TObject);
var i:Integer; begin with ServerSocket1 Do begin for i:=0 to Socket.ActiveConnections Do begin Socket.SendText('PING'); end; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin IF Serversocket1.Socket.Connections[SelectedVictim].ReceiveText = 'On' then begin end else begin listbox1.items.delete(selectedvictim); end; end;
Delphi-Quellcode:
Aber es kommt immer die Fehlermeldung
if str = 'Ping' then
begin Socket.SendText('On'); end; Windows socket error: Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde (10057) |
Re: Namen erscheinen gehen aber nicht weg
es muss heißen
Delphi-Quellcode:
/edit1: im übrigen würde ich dir ans herz legen,
for i:=0 to Socket.ActiveConnections[b]-1[/b] Do
![]() /edit2: wieso stellst du eigentlich nicht einfach in das disconnect-event des serversockets, dass der client aus der listbox genommen wird? :gruebel: |
Re: Namen erscheinen gehen aber nicht weg
Funktioniert leider auch nicht :/
|
Re: Namen erscheinen gehen aber nicht weg
eine zeilenangabe wo der fehler auftritt wäre sinnvoll
|
Re: Namen erscheinen gehen aber nicht weg
nebenbei bemerkt, was ist das für ein Gebilde:
Delphi-Quellcode:
Warum ein leerer begin-end-Block?
IF Serversocket1.Socket.Connections[SelectedVictim].ReceiveText = 'On' then
begin end else begin listbox1.items.delete(selectedvictim); Wenn du den Eintrag löschen willst, wenn kein "On" gesendet wurde, dann machst es am Einfachsten mit einem "not":
Delphi-Quellcode:
[Edit] Und bevor ich verbessert werde: ja, es ginge auch mit einem <> und ohne not
If not (Serversocket1.Socket.Connections[SelectedVictim].ReceiveText = 'On') then
listbox1.items.delete(selectedvictim); |
Re: Namen erscheinen gehen aber nicht weg
Ist es nicht nonsens sich hier eine Frage-Antwort-Prozedur "zusammenzudoktern"?
Um auf den ersten Post zu antworten, da muss wohl etwas in den aufgerufenen Prozeduren im OnClientDisconnect falsch laufen. Folglich sollte doch dort angesetzt werden und nicht durch eine zweifelhafte Methode immer noch mehr Fehler provozieren. Einwände? :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz