동일한 LAN에 있는 두 개의 네트워크로 연결된 Linux 시스템에 두 개의 응용 프로그램이 있습니다. 지정된 포트에서 TCP 연결을 수신하고 연결되면 데이터를 보내는(수신하지는 않는) 서버 프로그램을 실행합니다. 다른 시스템의 클라이언트 프로그램은 TCP 연결을 수신하고 연결되면 서버로부터 데이터를 수신할 것으로 예상합니다(그러나 자체적으로 데이터를 내보내지는 않습니다).
nc server1 30000 | nc client1 29999
지금까지는 또는 중 하나를 사용해 왔지만 socat -u TCP:server1:30000 TCP:client1:29999
네트워크 연결이 실패하면 어떤 솔루션을 사용해도 프로세스가 종료되지 않고 자동으로 다시 연결되지 않습니다.
이를 수행하는 우아한 방법이 있습니까?
앞서 나는 멀티캐스팅을 고려했습니다. 즉, 서버가 네트워크를 통해 데이터를 멀티캐스트하는 것을 고려했지만 데이터 스트림을 종료하려면 각 시스템에서 위 명령 중 하나가 필요하며 결국 동일한 문제가 발생할 수 있습니다.
연결은 대역폭이나 CPU를 포화시킬 만큼 충분하지 않은 소량의 데이터만 전송합니다.
답변1
내 생각에 정말 확실한 해결책은 C(또는 Python이나 Perl)로 작은 애플리케이션을 작성하는 것입니다. 일반적으로 먼저 다음 사항을 확인해 보세요.연결하다실패했거나 전송하는 데 시간이 너무 오래 걸렸습니다. 두 번째는 서버에서 얼마나 많은 데이터를 받고 있는지, 데이터를 보내고 받는 데 시간이 얼마나 걸리는지 확인하는 것입니다. 문제가 발생하면 다시 시도해 주세요.
Bash에서는 다음을 확인할 수 있습니다.연결하다실패 또는 사용되지 않은 NC 종료 코드입니다.
환경의 제약에 따라 bash에서 시간 초과를 확인하는 것은 까다로울 수 있습니다. timeout
설치할 수 있다면 쉬울 것입니다. 그렇지 않은 경우에도 순수 bash로 무언가를 작성할 수 있습니다.
데이터를 보낸 후 원격 서버의 연결이 끊기는 경우 수신 시간이 일정 시간보다 긴지 확인할 수 있으므로 보다 쉽게 제어할 수 있습니다.
중간 호스트에서 모든 데이터를 먼저 수신한 다음 클라이언트에 연결할 수 있다면 이는 쉬울 수도 있습니다.
그것은 다음과 같습니다:
loop for some acceptable amount of retries
connect server
if connect failed continue
save data to buffer
if connection close and not enough data continue
if timeout happened interrupt and continue
now if we got data do other loop
connect client
if connect failed continue
send buffer
if timeout happened interrupt and continue (this is only acceptable if your client is OK to receive data multiple times)
Bash에서 위 작업을 수행하는 방법(참고 - 실제로 모든 것을 테스트하지는 않았으므로 약간의 변경이 필요할 수 있습니다):
for ((attempt = 0; attempt < 10; attempt++)); do
BUFFER=$(timeout 10 nc server1 port1) || continue
[ ${#BUFFER} -ge 1 ] || continue
for ((client_attempt = 0; client_attempt < 10; client_attempt++)); do
echo "$BUFFER" | timeout 10 nc client2 port2 || continue
done
break
done
답변2
nmap
나는 다음과 같이 while(true) 루프 내에서 '를 사용하게 되었습니다 .ncat
/bin/bash -c while true; do ncat -i 50s --recv-only remotehost 12345 | ncat -i 50s --send-only localhost 12346; sleep 10; done
50초의 시간 초과 후 각 프로세스가 종료되고 while 루프가 해당 프로세스를 다시 생성합니다.