Eu acho que uma solução realmente confiável seria escrever um pequeno aplicativo em C (ou python ou perl). Em geral, a primeira coisa que você pode verificar se conectar falharam ou a transferência está demorando muito. A segunda coisa é verificar quantos dados você recebeu do servidor e quanto tempo leva para enviar / receber dados. E tente novamente se algo deu errado.
No bash, você pode verificar se conectar falhou ou não está usando o código de saída do nc.
A verificação do tempo limite pode ser complicada no bash dependendo das restrições do seu ambiente - se você pode instalar timeout
, isso deve ser fácil. Se não, você ainda pode escrever algo em pura festança.
Será muito mais controlável se o seu servidor remoto perder a conexão após o envio de dados que você pode verificar se o recebimento demorar mais do que algo.
Também pode ser fácil se você puder receber todos os dados primeiro em seu host intermediário e conectar o cliente posteriormente.
Algo como:
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)
Como fazer acima no bash (note - eu realmente não testei tudo isso, então pode precisar de pequenas alterações):
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