Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   ServerSocket.Socket.Connections[i].Close; (https://www.delphipraxis.net/158291-serversocket-socket-connections%5Bi%5D-close%3B.html)

Pfanne 11. Feb 2011 19:56

ServerSocket.Socket.Connections[i].Close;
 
Hallo,

mit:

Delphi-Quellcode:
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;
füge ich jeden neuen Client der"ListBox_Clients" hinzu.

mit:

Delphi-Quellcode:
{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;
möchte ich die in der Liste selektierten Clients (auch Multiselekt) schließen.

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......

Aphton 11. Feb 2011 20:40

AW: ServerSocket.Socket.Connections[i].Close;
 
Zitat:

Zitat von Pfanne (Beitrag 1081131)
Hallo
Delphi-Quellcode:
{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;
Was mache ich verkehrt?

Du machst es buchstäblich verkehrt (falls die Elemente beim Schließen aus dem Array entfernt werden...)
und weiters ist die äußere While-Schleife unnötig

Delphi-Quellcode:
{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;
In diesem Fall macht es nichts aus, wenn das Array verkürzt wird...
Weiß aber nicht, ob es wirklich daran liegt!

Klaus01 11. Feb 2011 20:44

AW: ServerSocket.Socket.Connections[i].Close;
 
Delphi-Quellcode:
{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;
Wenn Du mit break die innere Schleife verlassen hast,
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

sx2008 11. Feb 2011 21:35

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.

Aphton 11. Feb 2011 22:19

AW: ServerSocket.Socket.Connections[i].Close;
 
Zitat:

Zitat von sx2008 (Beitrag 1081150)
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.

Wie kommst du zu diesem Entschluss?
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?

Pfanne 11. Feb 2011 22:37

AW: ServerSocket.Socket.Connections[i].Close;
 
Hallo,

Zitat:

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.
Ich verstehe das so:

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

Sir Rufo 11. Feb 2011 23:56

AW: ServerSocket.Socket.Connections[i].Close;
 
Um das ganze Geraffel einfacher zu bekommen
Delphi-Quellcode:
lb_Clients.Items.AddObject( IntToStr(Socket.SocketHandle) + #9 + Socket.RemoteAddress, Socket );
Jetzt hast in der Liste den direkten Zugang zum Socket
Delphi-Quellcode:
if lb_Clients.Selected[i] then
    TCustomWinSocket( lb_Clients.Items.Objects( i ) ).Close;

sx2008 12. Feb 2011 00:17

AW: ServerSocket.Socket.Connections[i].Close;
 
Zitat:

Zitat von Pfanne (Beitrag 1081157)
Wird dies in der Liste lb_Clients.Items[x] exakt nachgeführt sollten die Connections und die Items übereinstimmen.

Wenn aber ein Client von sich aus die TCP-Verbindung schliest oder die Verbindung zum Client unterbochen werden sollte, dann passen die beiden Listen nicht mehr zusammen.

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;

Sir Rufo 12. Feb 2011 00:43

AW: ServerSocket.Socket.Connections[i].Close;
 
Gut das es dafür ja Events gibt:
Delphi-Quellcode:
lb_Clients.Items.AddObject( IntToStr(Socket.SocketHandle) + #9 + Socket.RemoteAddress, Socket );
Socket.OnDisconnect := ClientSocketDisconnect;
Und in der Methode dann
Delphi-Quellcode:
procedure TForm1.ClientSocketDisconnect( Sender : TObject );
var
  idx : integer;
begin
  idx := lb_Clients.Items.IndexOfObject( Sender );
  lb_Clients.Items.Delete( idx );
end;

Pfanne 12. Feb 2011 13:08

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:
{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;
läuft wie Teufel..... Danke


ein weiteres Problem:
Delphi-Quellcode:
ServerSocket.Open;
lbl_ServerStatus.Caption := 'ONLINE';
lbl_ServerIP.Caption:= 'IP: ' + ServerSocket.Socket.LocalAddress;
socket.LocalAddress bringt mir 0.0.0.0 erst wenn sich ein Client verbunden hat
Delphi-Quellcode:
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;
Liefert socket.LocalAddress meine eigene IP, hängt das damit zusammen, dass oben (ServerSocket.Socket.LocalAddress) noch gar kein Socket aktiv ist?
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.
Seite 1 von 2  1 2      

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