Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   ClientSocket soll viele Server schnell abfragen (https://www.delphipraxis.net/201711-clientsocket-soll-viele-server-schnell-abfragen.html)

holger_barntrup 19. Aug 2019 07:05

ClientSocket soll viele Server schnell abfragen
 
Hallo und einen guten Morgen in die Runde.

Ich bräuchte mal einen Denkanstoß.
Ich habe eine kleine Hilfsanwendung mit einem ClientSocket realisiert mit dem ich mich mit verschiedenen Servern verbinden kann (CNC-Maschinen) und dort per ASCII Zeichenfolge verschiedene Daten abfrage.
Es sind nur ein paar wenige Maschinen, ich wähle eine aus einer Liste aus, verbinde mich und sende per Klick eine Abfrage wenn die Verbindung steht oder auch nicht wenn ich nur sehen will ob sie online ist.
Sollte eine Maschine nicht eingeschaltet sein dauert es etwa 20 Sec. bis ich die Rückmeldung bekomme. Solange muss ich warten. Bei den paar Maschinen kein Problem aaaaber jetzt sollen noch 50 weitere dazu.
Es sind ältere Maschinen mit reinen CNC Steuerungen die an Kommunikation nicht wirklich etwas können. Dort werden jetzt Digital zu Ehternet Klemmen eingesetzt die auch per ASCII abgefragt werden können. Also nicht viel anders als bisher.
Ich möchte das jetzt gerne automatisieren, also zyklisch alle xx sec. alle Maschinen abfragen. Wenn jetzt natürlich einige nicht online sind würde ich bei einer seriellen Abfrage sehr schnell viel Zeit verlieren die den nächsten Abfragezuklus vielleicht schon überschreitet.

Wie stelle ich das am geschicktesten und elegantesten an? Ich hab schon hier im Forum nach etwas vergleichbarem gesucht aber entweder fehlen mir die richtigen Suchbegriffe oder es wurde in der Form noch nicht behandelt.

Bringt mich mal bitte jemand auf die richtige Spur. Gibt es irgendwo Beispiele die ähnlich geartet sind?
Ich denke der Quelltext der vorhandene Hilfsanwendung spielt hier keine weitere Rolle.

jaenicke 19. Aug 2019 07:12

AW: ClientSocket soll viele Server schnell abfragen
 
Du kannst einfach eine parallele for-Schleife benutzen und dabei in jedem Durchlauf einen eigenen TClientSocket erstellen. Dann brauchst du insgesamt nur einmal bis zum Timeout, weil alle quasi parallel angefragt werden.

Alternativ kannst du natürlich auch gleich einen richtigen Thread benutzen (bzw. diese Schleife im Thread). Das wäre sicher die beste Lösung, aber eben auch mit etwas Aufwand verbunden.

hoika 19. Aug 2019 07:40

AW: ClientSocket soll viele Server schnell abfragen
 
Hallo,
ich würde auch Thread(s) benutzen, die eine Queue füllen mit den aktuellen Online-Maschinen.
Im Prinzip laufen x Threads, deren einzige Aufgabe es ist, den Online-Status der x Maschinen zu prüfen/zu aktualisieren.

Die 20 Sekunden sind übrigens der Standard-Timeout von Windows.

holger_barntrup 19. Aug 2019 08:06

AW: ClientSocket soll viele Server schnell abfragen
 
Da muss ich mich etwas einarbeiten, das sind momentan noch Böhmische Dörfer für mich.

holger_barntrup 19. Aug 2019 08:25

AW: ClientSocket soll viele Server schnell abfragen
 
Zitat:

Zitat von jaenicke (Beitrag 1442031)
Du kannst einfach eine parallele for-Schleife benutzen und dabei in jedem Durchlauf einen eigenen TClientSocket erstellen. Dann brauchst du insgesamt nur einmal bis zum Timeout, weil alle quasi parallel angefragt werden.

Das mit dem TParallel.For erscheint mir nicht unsympathisch, was mir da aber noch nicht klar ist wie ich die unterschedlichen IP Adressen zuweise. :?:

Schokohase 19. Aug 2019 08:39

AW: ClientSocket soll viele Server schnell abfragen
 
Nun ja, so was wäre möglich
Delphi-Quellcode:
var
  addresses: tArray<string>;
begin
  addresses := ['a', 'b', 'c'];
  TParallel.&For(Low(addresses), High(addresses),
    procedure(index: Integer)
    var
      adr: string;
    begin
      adr := addresses[index];
      // mach was mit adr
    end);
end;

HolgerX 19. Aug 2019 09:09

AW: ClientSocket soll viele Server schnell abfragen
 
Hmm..

Optional könntest Du auch vorher per PING mit nem TimeOut von einer Sekunde (sollte im lokalen Netz reichen) abfragen..
Geht natürlich nur, wenn die Ethernetkarten der Maschinen ein Ping erlauben.

Aber so würdest Du schon wissen, ob sie eingeschaltet sind, bevor Du per TCP/IP dann eine Verbindung versuchst aufzubauen.

ensaron 19. Aug 2019 10:04

AW: ClientSocket soll viele Server schnell abfragen
 
Die Lösung via eigenem Thread wäre meiner Meinung nach von Vorteil, wenn das Abfrageintervall kürzer sein soll, als das maximal mögliche Timeout. Bei Verwendung von eigenen Threads könntest du dir eine Lösung programmieren, die vor dem Anlegen eines neuen Threads erst einmal die Liste der laufenden Threads durchgeht und nachschaut, ob zu der gewünschten Maschiene bereits ein noch offener Verbindungsversuch gestartet ist.

Michael II 19. Aug 2019 13:20

AW: ClientSocket soll viele Server schnell abfragen
 
Schau dir mal die ICSOverbyte WinSock Komponente an.

Alles ist Event gesteuert, nicht blockierend; dein Thread muss also zum Beispiel nach einem Connect Versuch (zu einer deiner Maschinen) nicht darauf warten, bis die Gegenstelle antwortet. Du kannst zu allen 101 Maschinen aufs Mal einen Connect Versuch starten und erhältst später via Ereignisse mitgeteilt, ob eine Session zustande gekommen ist, wenn sich ein Socket Status ändert usw. Es ist also völlig egal, wie lange der Verbindungsaufbau zu einer Machine X dauert: Da nicht darauf gewartet wird, ob und wann X antwortet, wird dein Thread nicht blockiert.


Ich habe mit ICS ein p2p Spiel programmiert: Ein User, welcher sich einloggt erhält eine nicht unbedingt sehr aktuelle Liste von Spielservern. Das Szenario ist also praktisch identisch. Alles läuft in einem Thread. In deinem Fall genügt für die Kommunikation (mit ICS) sicher der Hauptthread.

ensaron 19. Aug 2019 13:47

AW: ClientSocket soll viele Server schnell abfragen
 
Ja die ICS Komponenten kann ich auch empfehlen. Wenn du mit Threads bisher noch nicht viel gemacht hast, dürftest du mit ICS schneller zum gewünschten Ergebnis kommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
Seite 1 von 5  1 23     Letzte »    

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