Como posso enviar dados com segurança de uma porta TCP em um computador pela rede para uma porta diferente em outra?

0

Eu tenho dois aplicativos em duas máquinas Linux em rede na mesma LAN. Um executa um programa do servidor que ouve conexões TCP em uma porta especificada e, quando conectado, emite (mas não recebe) dados. Um programa cliente em uma máquina diferente escuta conexões TCP e, quando conectado, espera receber os dados enviados pelo servidor (mas não emite nenhum).

Até agora eu tenho usado nc server1 30000 | nc client1 29999 ou socat -u TCP:server1:30000 TCP:client1:29999 , mas com uma das soluções quando a conexão de rede falha, o processo não termina e não se reconecta automaticamente.

Existe uma maneira elegante de fazer isso?

No começo, eu estava pensando em multicast; Ou seja, o servidor deve multicastar os dados através da rede, mas isso exigiria que um dos comandos acima em cada computador terminasse o fluxo de dados e pudesse acabar com os mesmos problemas.

Esta conexão transfere apenas uma pequena quantidade de dados; certamente nem perto o suficiente para saturar a largura de banda ou a CPU.

    
por Steven Davies 26.12.2017 / 16:50

2 respostas

2

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
    
por 26.12.2017 / 20:58
1

Acabei usando o nmap ' ncat em um loop while (true) assim:

/bin/bash -c while true; do ncat -i 50s --recv-only remotehost 12345 | ncat -i 50s --send-only localhost 12346; sleep 10; done

Após o tempo limite de 50 segundos, cada um dos processos termina e o loop while os reaparecerá.

    
por 15.01.2018 / 11:27