TCP: Wäre es überhaupt machbar gewesen?

  • Hallo,

    ich hatte folgende Aufgabe zu lösen:

    10 Rechner (verbunden durch WLAN und DLAN) hatten insgesamt 50 Autoit-Programme am laufen, die alle von einem dieser Rechner "gesteuert" werden sollten.
    Steuern heisst an der Stelle nur banales "Ein / Ausschalten" von Funktionen dieser Autoit Programme, dabei soll der Ein / Aus Zustand von jedem dieser Programme auf dem Hauptrechner sichtbar sein.

    Im Vorfeld habe ich kleine Clients und Serverprogramme geschrieben, welche tadellos funktioniert haben (beim Testen mit 5 Programmen und 2 Rechnern).
    Im großen Verbund ist dann aber alles komplett schief gelaufen:

    Es ging schon mit dem Verbindungsaufbau los. Für jeden Verbindungsaufbau hat das Programm ca. 1-4s benötigt. Das waren bei 50 Programmen ca. 100s nur für den Verbindungsaufbau!
    Dann war die WLAN Verbindung wohl teilweise nicht sehr stark, so dass der Client (Kontrollprogramm über die 50 Server) teilweise gemeldet hat, dass die Verbindung zu ein paar Servern nicht mehr steht - wenn man aber die Server gefragt hat, dann war die Verbindung noch da. Mit Netstat konnte ich dann rauskriegen, dass die Verbindung tatsächlich noch bestand, der Client aber der Meinung war, dass die Verbindung nicht mehr da war.
    In der Folge wollte der Client die Verbindung neu aufbauen, die Server aber nicht (sie bestand ja noch). Das ging dann auch nicht usw.
    Somit ist es passiert, dass eine Verbindung scheinbar nicht aufgebaut werden konnte, obwohl man den Rechner übers Netz anpingen konnte!!!!!!!!!!

    Fazit: Am Ende musste ich von den 10 Rechnern 7 vom Netz nehmen und das ganze ist dann noch mit 3 Rechnern und 15 Autoit Servern gelaufen. Mehr oder weniger stabil.

    Die Programme waren so aufgebaut, dass ich immer 10s lang versucht habe, neue Verbindungen aufzubauen. Nach den 10s habe ich dann schnell alle bestehenden Verbindungen angepingt, damit die nicht in einen Timeout gelaufen sind...

    Ich habe nur gemerkt, dass ich das ganze Timing nicht wirklich im Griff hatte und dass die TCP Verbindung überhaupt nicht so abgesichert ist, wie ich es erhofft habe.

    Das ganze ist jetzt ein wenig unkonkret, vielleicht wollte ich nur mal meinen Frust von der Seele schreiben.
    Jetzt habe ich wieder ein Jahr Zeit, es besser zu machen. Wie geht man so etwas sinnvoll an?

  • Eventuell (ich weiß es aber nicht) ist Ping an diesem Problem Schuld.
    Weil "schnell 50x anpingen" leider ziemlich langsam ist. Oft hält sich die Ping Funktion nicht an das Timeout. (Daher könnte eine Verzögerungsquelle kommen).
    Als Abhilfe dafür kannst du dir einige Skripte ansehen in denen z.B. in einem Lokalen Netzwerk alle Adressen durchgepingt werden, dort wird ein Hilfsskript (welches nur einen Ping und die Erfolgsrückgabe beinhaltet) verwendet. Dieses wird z.B. 50x direkt hintereinander gestartet, damit verkürzt sich die Pingzeit, da die 50 Skripte parallel laufen können. Das Hauptskript erhält dann nur noch die Meldungen.
    Wie das genau funktioniert musst du selbst nachschauen, soetwas habe ich bisher noch nicht programmiert und kenne keine genauen Einzelheiten.

    lg
    M

  • Hi,

    Zitat

    10 Rechner (verbunden durch WLAN und DLAN) hatten insgesamt 50 Autoit-Programme am laufen, die alle von einem dieser Rechner "gesteuert" werden sollten.

    Zitat

    so dass der Client (Kontrollprogramm über die 50 Server) teilweise gemeldet hat, dass die Verbindung zu ein paar Servern nicht mehr steht

    passt imho auch nicht zusammen...
    Wieso sich ein Client mit 50 Serverprozessen verbinden soll, verstehe ich nicht.
    Ich würde einen Server aufsetzen, der die 50 Clients bedient. Mit 22 Clients habe ich das schon gehandled. Sobald der Server Offline ist, merken das die Clients über TCP sofort.
    Beim Server muss natürlich innerhalb einer Schleife jeder der Clients "abgefragt" werden, ob er noch online ist. Das geht aber auch ganz fix.
    Das beseitigt auch folgendes "Problem" völlig:

    Zitat

    Die Programme waren so aufgebaut, dass ich immer 10s lang versucht habe, neue Verbindungen aufzubauen.

    1.) Der Client versucht sich zum Server zu verbinden, ist dieser "down" dann Email zum Admin "Server down". Erledigt.
    2.) Der Server versucht nach einer Anfrage des Clients (!) direkt zu antworten. Ist jetzt der Client "down", wird die Antwort entweder "fürs nächste Mal" gepuffert oder verworfen.

    Zitat

    Mit Netstat konnte ich dann rauskriegen, dass die Verbindung tatsächlich noch bestand, der Client aber der Meinung war, dass die Verbindung nicht mehr da war.

    Diesen Fall hatte ich ehrlich gesagt noch nicht. Ich vermute den Fehler allerdings weniger im TCP, sondern an der imho "kruden" Implementierung mit 50 Servern auf 10 Rechnern und einem Client....

    • Offizieller Beitrag

    Hallo,

    Mein Tipp um mit vielen clients zu arbeiten: http://www.autoitscript.com/forum/topic/74…f-event-driven/

    Hatte damit schon über 100 Verbindungen über einem Server gehandelt, und das sogar über Internet ;) Benutzt größtenteils zwar die AutoIt funktionen, aber funktioniert halt via OnEvent (respektive GuiRegisterMsg)

    Gruß,
    Spider