從一個客戶端到多個客戶端的 TCP/IP 中繼

從一個客戶端到多個客戶端的 TCP/IP 中繼

我正在尋找一個在 Fedora 下運行的 Linux 工具,它將打開一個 tcp/ip 套接字進行監聽,讓它在同一連接埠上連接多個客戶端。然後,當一個客戶端發送訊息時,將其轉發給所有其他客戶端。而不是將其轉發回原始客戶端,但如果它也轉發回原始客戶端,那就可以了。我不確定“中繼”在這裡是否是正確的術語,也許如果我搜尋另一個關鍵字,我會得到更好的結果。需要明確的是:伺服器不應在套接字之上有協定。如果有一個協議,它將僅在發送和接收時在客戶端上實現。進一步的要求是可靠性是最重要的,這就是為什麼我正在尋找 TCP/IP 而不是 UDP。歡迎任何其他使其更可靠的建議。

我在一些地方尋找解決方案:

https://cr.yp.to/ucspi-tcp/tcpserver.html產生“程式”的不同實例,然後它們仍然需要相互通信,因此這只是部分解決方案。

具有多個客戶端的 TCP 代理?我正在尋找的解決方案並不首先連接到端口,因此似乎不合適。

https://stackoverflow.com/questions/9024227/duplicate-input-unix-stream-to-multiple-tcp-clients-using-socat/11362423我沒有寫入套接字的進程,所以似乎不合適。

儘管前兩個連結的問題與我的不符,但其中的一些內容讓我相信 socat 仍然是一個選擇,但我不確定。

答案1

怎麼樣:

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

答案2

這就能解決問題:

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'

這個想法是為每個新連接創建一個命名管道,然後回顯到標準輸出(即發送到客戶端)從管道中讀取的任何內容。讀取標準輸入(即由客戶端發送到伺服器),並將接收到的任何內容回顯到除自己的管道之外的所有命名管道。

相關內容