TCP/IP-Relay von einem Client zu mehreren Clients

TCP/IP-Relay von einem Client zu mehreren Clients

Ich suche nach einem Linux-Tool, das unter Fedora läuft und einen TCP/IP-Socket zum Abhören öffnet, sodass mehrere Clients über denselben Port verbunden werden können. Wenn dann ein Client eine Nachricht sendet, leitet er sie an alle anderen Clients weiter. Sie soll nicht an den ursprünglichen Client zurückgeleitet werden, aber wenn sie auch an den ursprünglichen Client zurückgeleitet wird, ist das ok. Ich bin nicht sicher, ob „Relay“ hier der richtige Begriff ist. Vielleicht hätte ich bessere Ergebnisse erhalten, wenn ich nach einem anderen Schlüsselwort gesucht hätte. Nur um das klarzustellen: Es sollte kein Protokoll über dem Socket vom Server geben. Wenn es ein Protokoll geben soll, wird es nur beim Senden und Empfangen auf dem Client implementiert. Eine weitere Anforderung ist, dass Zuverlässigkeit das Wichtigste ist, deshalb suche ich nach TCP/IP und nicht nach UDP. Alle anderen Vorschläge, um es zuverlässiger zu machen, sind willkommen.

Einige Orte, an denen ich nach einer Lösung gesucht habe:

https://cr.yp.to/ucspi-tcp/tcpserver.htmlErzeugt verschiedene Instanzen des „Programms“, die dann weiterhin miteinander kommunizieren müssen, es handelt sich also nur um eine Teillösung.

TCP-Proxy mit mehreren Clients? Die Lösung, nach der ich suche, stellt nicht zuerst eine Verbindung zu einem Port her und scheint daher nicht geeignet.

https://stackoverflow.com/questions/9024227/duplicate-input-unix-stream-to-multiple-tcp-clients-using-socat/11362423Ich habe keinen Prozess, der in einen Socket schreibt, daher scheint es nicht geeignet.

Auch wenn die Fragen in den beiden vorherigen Links nicht mit meinen übereinstimmen, gibt es dort Dinge, die mich glauben lassen, dass Socat dennoch eine Option sein könnte, aber ich bin nicht sicher.

Antwort1

Wie wäre es mit etwas wie:

socat tcp-listen:1234,fork,reuseaddr \
      'system:tail -fn +0 file & cat >> file'

Antwort2

So funktioniert es:

socat tcp-listen:5555,fork,reuseaddr \
'system:
PIPE=$(mktemp -u /tmp/pns_XXX)
mkfifo $PIPE
while read PIPE_MESSAGE<$PIPE; do
  echo $PIPE_MESSAGE
done &
PID=$!
while read CLIENT_MESSAGE; do
  for OTHER_PIPE in $(ls /tmp/pns_*); do
    [ $PIPE != $OTHER_PIPE ] && echo $CLIENT_MESSAGE > $OTHER_PIPE
  done
done
kill $PID
rm $PIPE'

Die Idee besteht darin, für jede neue Verbindung eine benannte Pipe zu erstellen und dann alles, was aus der Pipe gelesen wird, an die Standardausgabe (d. h. an den Client zu senden) zurückzusenden. Die Standardeingabe (d. h. vom Client an den Server gesendet) wird gelesen und alles, was empfangen wird, wird an alle benannten Pipes zurückgesendet, außer an die eigene Pipe.

verwandte Informationen