Client -> Server Verbindung [Wenn Server nicht erreichbar ist, alle abfragen verwerfen]

  • C#
  • .NET 4.5

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Client -> Server Verbindung [Wenn Server nicht erreichbar ist, alle abfragen verwerfen]

    Hallo Leute, und danke für's reinschauen.

    Ich kenn mich bei den TCP nicht so gut aus, daher so eine Frage mal:

    Ein Arduino TCP Client sendet in einem festgelegten Intervall eine Anfrage an Server, die der Server recht schnell bearbeitet und dem Client eine Antwort sendet.

    Mein Problem ist es aber, dass wenn der Server mal nicht da ist, oder das Programm nicht gestartet ist, so wird er beim wieder einschalten mit Anfragen überrumpelt. Kurzgesagt, die alten Anfragen werden nicht verworfen, sondern werden (Gott weiß wo) gespeichert und beim Einschalten des Servers alle auf einmal bearbeitet. Kann man das irgend wie abstellen? Sodass wenn keine Antwort kam, sprich der Server gerade nicht da ist, oder das Programm nicht gestartet ist, so sollen alle Anfragen von allen Klienten verworfen werden...

    Kennt einer eine Lösung? ?(
    Also wenn dein "Server-Programm" nicht läuft bzw. nicht ereichbar ist, wo sollen denn die Anfragen gespeichert werden? Ein Stau im Kabel geht ja schlecht, genauso wenig irgendwo in der Luft falls WLAN im Spiel. Ein Arduino allein hat auch nicht genug Speicher um viele fehlgeschlagenen Request zu speichern um die erneut zu senden. Ohne deinen Aufbau und Code zu sehen, wird deiner wohl keiner den entsprechenden Tipp geben können.
    Die Natur ist bekanntermaßen knallhart, sie sortiert aus was sich nicht bewährt hat.(Harald Lesch, 2021)

    Demnach müssten wir bald dran sein...
    Genau das meine ich ja. Ich hab mich auch gefragt, wo die Abfragen bleiben sollen. Im Kabel wird es ja wohl nicht sein. Es müsste irgend wo was eingestellt werden...

    Bo, Code... Welche stelle willst du den haben? Den gesamten wäre wohl echt viel. Vielleicht hab ich hier was falsch:

    C#-Quellcode

    1. public partial class jcTCPServer
    2. {
    3. public class StateObject
    4. {
    5. public const int BufferSize = 1024;
    6. public byte[] buffer = new byte[BufferSize];
    7. public StringBuilder sb = new StringBuilder();
    8. public Socket workSocket = null;
    9. }
    10. }
    11. public partial class jcTCPServer
    12. {
    13. public static ManualResetEvent allDone = new ManualResetEvent(false);
    14. public static string IpAdress = "192.168.178.92";
    15. public static int Port = 17;
    16. public jcTCPServer()
    17. {
    18. }
    19. public static void StartListening()
    20. {
    21. IPAddress ipAddress = IPAddress.Parse(IpAdress);
    22. IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Port);
    23. Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    24. try
    25. {
    26. listener.Bind(localEndPoint);
    27. listener.Listen(100);
    28. while (true)
    29. {
    30. allDone.Reset();
    31. Console.WriteLine("Warte auf eine Verbindung...");
    32. listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
    33. allDone.WaitOne();
    34. }
    35. }
    36. catch (Exception ex)
    37. {
    38. jcStatic.ShowError(ex);
    39. }
    40. finally
    41. {
    42. StartListening();
    43. }
    44. }
    An der Serverseite kann es ja eigendlich nicht liegen, da läuft ja nix, bzw. ist nichts erreichbar, da können doch keine Daten ankommen, welche zwischengespeichert werden, der Server wird sich ja wohl nicht selbst mit Requests bombardieren. :D Es wird auf der Clientseite sein, du sagst ja selber, sobald der Server wieder erreichbar ist, kommt eine Flut an Requests. Also die können ja nur vom Client kommen. Dein Sketch müsste man sehen.
    Die Natur ist bekanntermaßen knallhart, sie sortiert aus was sich nicht bewährt hat.(Harald Lesch, 2021)

    Demnach müssten wir bald dran sein...
    Ein Sketch ist der Sourcecode vom Programm welches auf dem Arduino läuft, das sollte man schon wissen, IMO "Grundlagen Fachbegriffe". Der Dateiname endet auf .ino
    Die Natur ist bekanntermaßen knallhart, sie sortiert aus was sich nicht bewährt hat.(Harald Lesch, 2021)

    Demnach müssten wir bald dran sein...
    Klugscheißer...

    C-Quellcode

    1. #include "jcMain.h"
    2. JcMainClass *jcMain;
    3. void setup()
    4. {
    5. jcMain = new JcMainClass();
    6. }
    7. void loop()
    8. {
    9. jcMain->jcRun();
    10. }


    and dieser stelle kommt die Anrfrage von Arduino:

    C-Quellcode

    1. StaticJsonDocument<200> tmpJson;
    2. tmpJson["Id"] = 0;
    3. tmpJson["MacAdresse"] = WiFi.macAddress();
    4. tmpJson["ClientIP"] = WiFi.localIP();
    5. tmpJson["SendBeginMillis"] = millis();
    6. tmpJson["RFIDKey"] = tmpRFID;
    7. String tmpResult;
    8. serializeJson(tmpJson, tmpResult);
    9. if (tmpRFID.length() > 0)
    10. {
    11. Display->clearDisplay();
    12. Display->setTextColor(SSD1306_WHITE);
    13. Display->setTextSize(2);
    14. Display->setCursor(4, 0);
    15. Display->println("Sende---->");
    16. Display->setCursor(4, 18);
    17. Display->println("<-Empfange");
    18. Display->display();
    19. }
    20. String debugStr = jcSendStringToHost(tmpResult);
    21. if (debugStr == "ERROR")
    22. debugStr = jcSendStringToHost(tmpResult);
    23. if (debugStr == "ERROR")
    24. debugStr = jcSendStringToHost(tmpResult);
    25. StaticJsonDocument<800> doc;
    26. DeserializationError error = deserializeJson(doc, debugStr);
    27. if (error)
    28. {
    29. jcDisplayPrintln("---------------------");
    30. jcDisplayPrintln("-- Server nicht --");
    31. jcDisplayPrintln("-- erreichbar --");
    32. jcDisplayPrintln("---------------------");
    33. Serial.print(F("deserializeJson() failed: "));
    34. Serial.println(error.f_str());
    35. return;
    36. }


    und hier ist das eigentliche senden:

    C-Quellcode

    1. ​ String jcSendStringToHost(String str)
    2. {
    3. while (WiFi.status() != WL_CONNECTED)
    4. {
    5. delay(100);
    6. Serial.print(".");
    7. }
    8. WiFiClient tmpClient;
    9. if (!tmpClient.connect(Host, Port))
    10. {
    11. tmpClient.flush();
    12. tmpClient.stop();
    13. Serial.println("ERROR:Connection Failed");
    14. return "ERROR";
    15. }
    16. if (tmpClient.connected())
    17. tmpClient.println(str + '\n');
    18. unsigned long timeout = millis();
    19. while (tmpClient.available() == 0)
    20. if (millis() - timeout > 100)
    21. {
    22. tmpClient.flush();
    23. tmpClient.stop();
    24. Serial.println("ERROR:Connection Timeout");
    25. return "ERROR";
    26. }
    27. String tmpResult = "";
    28. if (tmpClient.available())
    29. tmpResult = tmpClient.readStringUntil('\n');
    30. tmpClient.flush();
    31. tmpClient.stop();
    32. return tmpResult;
    33. }

    EugenIS schrieb:

    Klugscheißer...



    Noch mehr Klugscheißerei:

    Du solltest dir nicht alles aus der Nase ziehen lassen.
    Du erwartest Hilfe, also solltest du alles relevante posten bzw. erklären.


    Ich bin nach dem Kommentar eh raus hier, wenn dir jemand helfen soll, musst du mehr liefern. Du kannst doch nicht erwaten das jetzt jemand sucht was JcMainClass ist, was JcMainClass.jcRun() macht.

    Wieder klugscheißermdous:
    Liefer alles andere nach oder du wirst wohl selbst schauen müssen...

    Spekulatius backen:
    void loop() { jcMain->jcRun(); }
    wird das evtl. zu oft gecallt, gehöhrt das evtl. in setup()?
    Die Natur ist bekanntermaßen knallhart, sie sortiert aus was sich nicht bewährt hat.(Harald Lesch, 2021)

    Demnach müssten wir bald dran sein...