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

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

나는 수신을 위해 tcp/ip 소켓을 열고 동일한 포트에 여러 클라이언트를 연결할 수 있는 페도라에서 실행할 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'

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

관련 정보