![]() |
ServerSocket.Socket.Connections[i].Close;
Hallo,
mit:
Delphi-Quellcode:
füge ich jeden neuen Client der"ListBox_Clients" hinzu.
procedure Tfrm_Server.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin mem_EventLog.Lines.Add('ClientConnect Handle/IP: ' + IntToStr(Socket.SocketHandle) + ' / ' + Socket.RemoteAddress); Socket.SendText('Hallo'); lbl_ServerIP.Caption := 'IP: ' + socket.LocalAddress; lb_Clients.Items.add(IntToStr(Socket.SocketHandle) + #9 + Socket.RemoteAddress); end; mit:
Delphi-Quellcode:
möchte ich die in der Liste selektierten Clients (auch Multiselekt) schließen.
{Close selected Clients}
procedure Tfrm_Server.bu_CloseSelectedClick(Sender: TObject); var i: integer; begin while not (lb_Clients.SelCount = 0) do begin for i := 0 to lb_Clients.Count -1 do begin if lb_Clients.Selected[i] then begin ServerSocket.Socket.Connections[i].Close; break; end; end; end; end; Leider geht das ganze nur wenn 1 Client selektiert ist. Bei mehreren geht es nicht mehr. Ich habe schon bemerkt, dass unmittelbar nach: ServerSocket.Socket.Connections[i].Close; sich die Anzahl der serversocket.Socket.ActiveConnections nicht verringert. Was mache ich verkehrt? Danke...... |
AW: ServerSocket.Socket.Connections[i].Close;
Zitat:
und weiters ist die äußere While-Schleife unnötig
Delphi-Quellcode:
In diesem Fall macht es nichts aus, wenn das Array verkürzt wird...
{Close selected Clients}
procedure Tfrm_Server.bu_CloseSelectedClick(Sender: TObject); var i: integer; begin for i := lb_Clients.Count -1 downto 0 do if lb_Clients.Selected[i] then ServerSocket.Socket.Connections[i].Close; end; Weiß aber nicht, ob es wirklich daran liegt! |
AW: ServerSocket.Socket.Connections[i].Close;
Delphi-Quellcode:
Wenn Du mit break die innere Schleife verlassen hast,
{Close selected Clients}
procedure Tfrm_Server.bu_CloseSelectedClick(Sender: TObject); var i: integer; begin while not (lb_Clients.SelCount = 0) do begin for i := 0 to lb_Clients.Count -1 do begin if lb_Clients.Selected[i] then begin ServerSocket.Socket.Connections[i].Close; break; // hier verlässt Du die innere Schleife end; end; end; end; ist immer noch das zuerst gefunden selceted item im Status selected. Du deselektierst das Item nicht, noch löscht Du das Item aus der Liste Grüße Klaus |
AW: ServerSocket.Socket.Connections[i].Close;
Die Reihenfolge von lb_Clients.Items[] stimmt nicht zwingend überein mit der Reihenfolge von ServerSocket.Socket.Connections[i].
Das heisst: selbst wenn die Schleife rückwärts läuft und die Dinge, die Klaus01 bemängelt hat korrigiert wurden, kann es nicht richtig funktionieren. |
AW: ServerSocket.Socket.Connections[i].Close;
Zitat:
Heißt das evt. dass neue Sockets nicht zwingendermaßen ans Arrayende hinzugefügt werden, sondern ein ungültiges Sockethandle irgendwo in der Mitte des Arrays bei Connections[] ersetzt wird, wenn diesses vorhanden ist und das Event ClientConnect ausgeführt wird? |
AW: ServerSocket.Socket.Connections[i].Close;
Hallo,
Zitat:
Jede neue Connection wird an das Ende von ServerSocket.Socket.Connections[x] gesetzt, schließt eine Verbindung in der Mitte rutschen die hinteren auf. Wird dies in der Liste lb_Clients.Items[x] exakt nachgeführt sollten die Connections und die Items übereinstimmen. Dafür spricht das wahrlose einzelne Schließen von Connections, das geht. Das entspricht aber im Wesendlichen dem was Aphton auch fragt. Pf@nne |
AW: ServerSocket.Socket.Connections[i].Close;
Um das ganze Geraffel einfacher zu bekommen
Delphi-Quellcode:
Jetzt hast in der Liste den direkten Zugang zum Socket
lb_Clients.Items.AddObject( IntToStr(Socket.SocketHandle) + #9 + Socket.RemoteAddress, Socket );
Delphi-Quellcode:
if lb_Clients.Selected[i] then
TCustomWinSocket( lb_Clients.Items.Objects( i ) ).Close; |
AW: ServerSocket.Socket.Connections[i].Close;
Zitat:
So wie Sir Rufo das gezeigt hat ist es schon besser, aber immer noch nicht ganz wasserdicht. Könnte ja sein, dass das die Verbindung schon weg ist und dann würde lb_Clients.Items.Objects[i] auf ein freigegebenes Objekt zeigen:
Delphi-Quellcode:
// ungetestet
var SelectedSocket : TCustomWinSocket; ... if lb_Clients.Selected[i] then begin SelectedSocket := TCustomWinSocket(lb_Clients.Items.Objects[i]); // schauen, ob SelectedSocket noch in der Liste ist for j:= 0 to ServerSocket.Socket.ConnectionCount-1 do begin if SelectedSocket=ServerSocket.Socket.Connections[j] then begin SelectedSocket.close; break; end; end; lb_Clients.Items.Delete(i); end; |
AW: ServerSocket.Socket.Connections[i].Close;
Gut das es dafür ja Events gibt:
Delphi-Quellcode:
Und in der Methode dann
lb_Clients.Items.AddObject( IntToStr(Socket.SocketHandle) + #9 + Socket.RemoteAddress, Socket );
Socket.OnDisconnect := ClientSocketDisconnect;
Delphi-Quellcode:
procedure TForm1.ClientSocketDisconnect( Sender : TObject );
var idx : integer; begin idx := lb_Clients.Items.IndexOfObject( Sender ); lb_Clients.Items.Delete( idx ); end; |
AW: ServerSocket.Socket.Connections[i].Close;
Delphi-Quellcode:
procedure Tfrm_Server.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin lb_Clients.Items.AddObject(IntToStr(Socket.SocketHandle) + #9 + Socket.RemoteAddress , Socket); end;
Delphi-Quellcode:
läuft wie Teufel..... Danke
{Close selected Clients}
procedure Tfrm_Server.bu_CloseSelectedClick(Sender: TObject); var i: integer; SelectedSocket : TCustomWinSocket; begin for i := lb_Clients.Count -1 downto 0 do begin if lb_Clients.Selected[i] then begin SelectedSocket := TCustomWinSocket(lb_Clients.Items.Objects[i]); SelectedSocket.Close; end; end; end; ein weiteres Problem:
Delphi-Quellcode:
socket.LocalAddress bringt mir 0.0.0.0 erst wenn sich ein Client verbunden hat
ServerSocket.Open;
lbl_ServerStatus.Caption := 'ONLINE'; lbl_ServerIP.Caption:= 'IP: ' + ServerSocket.Socket.LocalAddress;
Delphi-Quellcode:
Liefert socket.LocalAddress meine eigene IP, hängt das damit zusammen, dass oben (ServerSocket.Socket.LocalAddress) noch gar kein Socket aktiv ist?
procedure Tfrm_Server.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin mem_EventLog.Lines.Add('ClientConnect Handle/IP: ' + IntToStr(Socket.SocketHandle) + ' / ' + Socket.RemoteAddress); Socket.SendText('Hallo'); lbl_ServerIP.Caption := 'IP: ' + socket.LocalAddress; {lb_Clients.Items.add(IntToStr(Socket.SocketHandle) + #9 + Socket.RemoteAddress);}noch änder! end; Wie würde man die eigene IP abfragen auch ohne das der Server open ist? Wie bekomme ich von einem aktiven Socket die MAC herraus? Wie bekomme ich meine eigene MAC hehrraus? Fragen über Fragen.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 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