하나의 클라이언트에서 여러 클라이언트로의 TCP/IP 릴레이

하나의 클라이언트에서 여러 클라이언트로의 TCP/IP 릴레이

저는 tcp/ip 소켓을 열어 수신 대기하고 동일한 포트에 여러 클라이언트를 연결할 수 있는 Fedora에서 실행되는 Linux 도구를 찾고 있습니다. 그런 다음 한 클라이언트가 메시지를 보내면 다른 모든 클라이언트에게 전달됩니다. 원래 클라이언트로 다시 전달하는 대신 원래 클라이언트로도 다시 전달하면 괜찮을 것입니다. 여기서 "릴레이"가 올바른 용어인지 확실하지 않습니다. 아마도 다른 키워드를 검색하면 더 나은 결과를 얻을 수 있을 것입니다. 명확하게 말하면 서버에는 소켓 위에 프로토콜이 있어서는 안 됩니다. 프로토콜이 있는 경우 송신 및 수신 시에만 클라이언트에서 구현됩니다. 추가 요구 사항은 안정성이 가장 중요하다는 것입니다. 이것이 바로 UDP가 아닌 TCP/IP를 찾는 이유입니다. 보다 안정적으로 만들기 위한 다른 제안도 환영합니다.

나는 몇 군데에서 해결책을 찾았습니다.

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'

아이디어는 각각의 새로운 연결에 대해 명명된 파이프를 생성한 다음 파이프에서 읽은 내용을 표준 출력(즉, 클라이언트에 전송)에 반영하는 것입니다. 표준 입력(즉, 클라이언트가 서버에 보낸 것)을 읽고 자체 파이프를 제외한 모든 명명된 파이프에 수신된 모든 내용을 에코합니다.

관련 정보