Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdTCPServer : An Gruppe verbundener Clients senden (https://www.delphipraxis.net/140753-tidtcpserver-gruppe-verbundener-clients-senden.html)

moelski 25. Sep 2009 12:04


TIdTCPServer : An Gruppe verbundener Clients senden
 
Moin !

Habe da einen TIdTCPServer wo sich Client connecten können:
Delphi-Quellcode:
type
  PClient  = ^TClient;
  TClient  = record
    PeerIP       : string[15];           { Cleint IP address }
    HostName     : String[40];           { Hostname }
    Command      : String[100];
    WindowHandel : HWND;                 {Window Handle der Applikation}
    WindowPosX, WindowPosY,
    WindowWidth, WindowHeight : SmallInt;
    Connected    : TDateTime;            { Time of connect }
    Thread       : Pointer;              { Pointer to thread }
  end;

procedure TMainFormServer.TCPServerConnect(AContext: TIdContext);
var
  NewClient: PClient;
begin
  GetMem(NewClient, SizeOf(TClient));

  NewClient.PeerIP     := AContext.Connection.Socket.Binding.PeerIP;
  NewClient.Connected  := Now;
  NewClient.Thread     := AContext;

  AContext.Data        := TObject(NewClient);

  try
    Clients.LockList.Add(NewClient);
  finally
    Clients.UnlockList;
  end;
end; (* TCPServer Connect *)
Soweit so gut. Nun möchte ich an alle conecteten Client eine Nachricht senden. Ich habe folgendes probiert:
Delphi-Quellcode:
var SelClient : PClient;
    i        : SmallInt;
begin
    try
      for I := 0 to Clients.LockList.Count - 1 do begin
        SelClient := PClient(Clients.LockList.Items[I]);
        TIdContext(SelClient.Thread).Connection.IOHandler.WriteLn('ShutDown');
      end;
    finally
      Clients.UnlockList;
    end;
Das klappt aber so nicht. Denn dann verabschiedet sich der Server.

Wie wäre denn hier das richtige Vorgehen?
Ich winke schon mal ein ganz bisserl in Richtung Klaus :hi:

DeddyH 25. Sep 2009 12:10

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Könntest Du nicht einfach per UDP einen Broadcast senden?

Klaus01 25. Sep 2009 12:19

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Hallo Dominik,

Delphi-Quellcode:
type
  PClient  = ^TClient;
  TClient  = record
    PeerIP       : string[15];           { Cleint IP address }
    HostName     : String[40];           { Hostname }
    Command      : String[100];
    WindowHandel : HWND;                 {Window Handle der Applikation}
    WindowPosX, WindowPosY,
    WindowWidth, WindowHeight : SmallInt;
    Connected    : TDateTime;            { Time of connect }
    //Thread       : Pointer;              { Pointer to thread }
    Thread       : TidContext;
  end;

Delphi-Quellcode:
var SelClient : PClient;
    i        : SmallInt;
begin
    try
      for I := 0 to Clients.LockList.Count - 1 do begin
        SelClient := PClient(Clients.LockList.Items[I]);
        SelClient.Thread.Connection.IOHandler.WriteLn('ShutDown');
      end;
    finally
      Clients.UnlockList;
    end;
wenn Du den Thread Typ auf TidContext änderst, knallst dann immer noch?

Grüße
Klaus

moelski 25. Sep 2009 12:27

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Moin Klaus,

das geht wohl so auch nicht.
Es knallt ja auch nicht wirklich (also ich bekomme keine Exception), aber der Server hängt. Das merkt man daran das sich die Clients nicht mehr sauber disconnecten.

moelski 25. Sep 2009 12:28

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Moin !

Zitat:

Könntest Du nicht einfach per UDP einen Broadcast senden?
Klar ginge das. Aber da ich doch eh zu jedem Client eine Verbindung halte sollte das doch auch gerichtet über TCP gehen :)

Klaus01 25. Sep 2009 12:45

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Hallo Dominik

was machen denn die Clients wenn sie das Kommando "shutdown" bekommen?
Oder bekommt der Client das Kommando erst gar nicht.
Melden sie sich korrekt ab?

Oder bleibt die TCP Verbindung noch stehen (netstat -n)?

Grüße
Klaus

moelski 25. Sep 2009 12:55

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Moin !

Zitat:

was machen denn die Clients wenn sie das Kommando "shutdown" bekommen?
Nichts. Es scheint so als kämen die dort niemals an.

Zitat:

Oder bekommt der Client das Kommando erst gar nicht.
Delphi-Quellcode:
      if not tcpClientTr.IOHandler.InputBufferIsEmpty then
        begin
          s:= tcpClientTr.IOHandler.InputBufferAsString;
          MainFormClient.IncomingMessages.Lines.Add('Received : ' + S);
          s:='';
        end
Da ich das direkt ausgebe und nichts kommt, kommt es vermutlich erst gar nicht am Client an :(

Zitat:

Melden sie sich korrekt ab?
Das Disconnect vom Server klappt - kann man gut mit TCPView beobachten.

Zitat:

Oder bleibt die TCP Verbindung noch stehen (netstat -n)?
Nein. Die ist nach dem Disconnect auch weg.

Ich frage mich aber ob ich in dieser Form überhaupt auf TIdContext zugreifen darf.

Klaus01 25. Sep 2009 13:18

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Hallo Dominik,

ich habe das mal mit einer minimal Konfiguration versucht.

Meine ClientList:

Delphi-Quellcode:
clientlist : TObjectList;
So füge ich Clients der Liste hinzu:

procedure TForm1.myOnConnect(aContext: TIdContext);
Delphi-Quellcode:
begin
  //memo1.lines.add(aContext.Connection.Socket.BoundIP);
  clientList.Add(aContext);
end;
und so schicke ich eine Meldung an die Clients:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Byte;
begin
  for i:=0 to clientList.Count -1 do
   (clientList[i] as TidContext).Connection.IOHandler.Write('Halloooooo');

end;
und die kommt auch an.

Grüße
Klaus

moelski 25. Sep 2009 13:50

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin Klaus,

ich habe das mal versucht. Aber irgendwie mag mein Client nicht empfangen.
Habe mal alles auf eine ganze einfache Demo zusammengestampft und angehängt.

Evtl. siehst du den Fehler ja :gruebel:

moelski 25. Sep 2009 14:48

Re: TIdTCPServer : An Gruppe verbundener Clients senden
 
Moin !

Also die Pakete gehen jedenfalls aufs Netz:
Code:
0x0000   00 00 00 00 00 01 00 00-00 00 00 02 08 00 45 00   ..............E.
0x0010   00 2D 00 00 00 00 40 06-7C C9 7F 00 00 01 7F 00   .-....@.|É....
0x0020   00 01 1D FC 08 85 00 00-00 15 00 00 00 69 50 10   ...ü.….......iP.
0x0030   40 00 00 00 00 00 41 43-4B 0D 0A                 @.....ACK..
Das ACK Sende ich als Feedback.

Nur werden die Pakete dann nicht empfangen :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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 by Thomas Breitkreuz