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:
--- 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