AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke ServerSocket.Socket.Connections[i].Close;
Thema durchsuchen
Ansicht
Themen-Optionen

ServerSocket.Socket.Connections[i].Close;

Ein Thema von Pfanne · begonnen am 11. Feb 2011 · letzter Beitrag vom 13. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2      
Pfanne

Registriert seit: 27. Jan 2011
23 Beiträge
 
#1

ServerSocket.Socket.Connections[i].Close;

  Alt 11. Feb 2011, 20:56
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......
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 11. Feb 2011, 21:40
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!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 11. Feb 2011, 21:44
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

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

  Alt 11. Feb 2011, 22:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 11. Feb 2011, 23:19
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?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Pfanne

Registriert seit: 27. Jan 2011
23 Beiträge
 
#6

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

  Alt 11. Feb 2011, 23:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 12. Feb 2011, 00:56
Um das ganze Geraffel einfacher zu bekommen
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

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

  Alt 12. Feb 2011, 01:17
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

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

  Alt 12. Feb 2011, 01:43
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Pfanne

Registriert seit: 27. Jan 2011
23 Beiträge
 
#10

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

  Alt 12. Feb 2011, 14:08
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....
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz