[1] MLD-5.x / Development / Patch für Plugin svdrpservice
 

Offline maf

  • MLD-Tester
  • Member
  • ******
  • Posts: 92
    • View Profile
Patch für Plugin svdrpservice
« on: June 19, 2019, 12:28:12 »
Vor einem guten Jahr habe ich über Probleme im OSD bei der Kommunikation zwischen Client und Server berichtet. Zum Beispiel ließ sich ein Timer auf dem Server nicht (de)aktivieren. Damals ging es noch um MLD 5.0. Doch nach dem Wechsel zu MLD 5.3 musste ich feststellen, das die Probleme weiterhin bestehen.

Zunächst dachte ich, es läge am Plugin remotetimers. Mittlerweile weiß ich, dass das Plugin svdrpservice den Fehler verursacht. Damit betrifft er viele Plugins auf dem Client, die mit dem Server kommunizieren, und dürfte auch für MLD 5.4 interessant sein, in dem wegen des Wechsels zu VDR 2.4.0 das Plugin remotetimers nicht mehr benötigt wird.

Ursache der Kommunikationsprobleme ist, dass der Server recht zügig die SVDRP-Verbindung beendet, wenn der Client sich nicht mehr meldet, und dem Client eine entsprechende Nachricht schickt. Der Client ignoriert jedoch den Timeout und hält fälscherweise die Nachricht des Servers (bzw. deren Reply Code) für die Antwort auf seine nächste Anfrage, ohne diese überhaupt abgeschickt zu haben.

Mit folgendem Patch server-timeout.patch habe ich das Problem für mich gelöst:
Code: [Select]
--- a/connection.c
+++ b/connection.c
@@ -192,7 +192,7 @@
        if (!Cmd)
                return false;

-       if (Reconnect && !file.IsOpen())
+       if (Reconnect && (!file.IsOpen() || ReceivedTimeout()))
                Open();
        if (!file.IsOpen()) {
                esyslog("svdrpservice: unable to send command to %s. Socket is closed", serverIp);
@@ -240,6 +240,18 @@
        return 0;
 }

+bool cSvdrpConnection::ReceivedTimeout() {
+       if (file.Ready() && ReadLine(0)) {
+               long int code = ::strtol(buffer, NULL, 10);
+               if (code != 221) {
+                        esyslog("svdrpservice: unexpected message from %s: '%s'", serverIp, buffer);
+               }
+               file.Close();
+               return true;
+       }
+       return false;
+}
+
 bool cSvdrpConnection::ReadLine(int TimeoutMs) {
        if (!file.IsOpen())
                return false;
--- a/connection.h
+++ b/connection.h
@@ -26,6 +26,7 @@
                bool            shared;

                int             Connect();
+               bool            ReceivedTimeout();
                bool            ReadLine(int TimeoutMs);
        public:
                cSvdrpConnection(const char *ServerIp, unsigned short ServerPort, bool Shared);

Ich würde mich freuen, wenn das MLD Team den Patch testen und im Erfolgsfall eine neue Version des Plugins für MLD 5.3 (und MLD 5.4) bereitstellen könnte

Offline clausmuus

  • Administrator
  • Expert Member
  • ********
  • Posts: 20456
    • View Profile
    • ClausMuus.de
Patch für Plugin svdrpservice
« Reply #1 on: June 19, 2019, 19:57:11 »
Ich hab's mit aufgenommen (in die 5.4). An der 5.3 wird nichts mehr gemacht.
MLD 5.5 - Raspberry PI - 7" Touch TFT - Squeeze Play
MLD 5.5 - lirc yaUsbIR - OctopusNet - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - 12TB HDD - Lian Li PC-C37B - Samsung LE40A559

[1] MLD-5.x / Development / Patch für Plugin svdrpservice
 



Users Online Users Online

0 Members and 1 Guest are viewing this topic.