ネットワークを介してあるコンピュータのTCPポートから別のコンピュータの別のポートにデータを確実に送信する方法は?

ネットワークを介してあるコンピュータのTCPポートから別のコンピュータの別のポートにデータを確実に送信する方法は?

同じLAN上の2つのネットワークに接続されているLinuxシステムには2つのアプリケーションがあります。指定されたポートでTCP接続を受信し、接続するとデータを送信する(受信しない)サーバープログラムを実行します。他のシステムのクライアントプログラムは、TCP接続を受信し、接続するとサーバーからデータを受信することを期待しています(ただし、それ自体はデータをエクスポートしません)。

nc server1 30000 | nc client1 29999これまでまたはいずれかを使用してきましたが、socat -u TCP:server1:30000 TCP:client1:29999ネットワーク接続が失敗した場合、どのソリューションを使用してもプロセスは終了せず、自動的に再接続されません。

これを行うエレガントな方法はありますか?

以前は、マルチキャストを検討しました。つまり、サーバーがネットワークを介してデータをマルチキャストすることを検討しましたが、データストリームをシャットダウンするには、各システムで上記のコマンドのいずれかが必要であり、最終的に同じ問題が発生する可能性があります。

接続は、帯域幅またはCPUを飽和させるのに十分でない少量のデータのみを送信します。

答え1

私の考えに本当に明確な解決策は、C(またはPythonやPerl)で小さなアプリケーションを書くことです。通常、まず次の点を確認してください。つながる失敗したか送信するのに時間がかかりすぎました。 2つ目は、サーバーがどれくらいのデータを受信して​​いるか、データを送受信するのにどれくらいの時間がかかるかを確認することです。問題が発生した場合はもう一度お試しください。

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ループはそのプロセスを再生成します。

関連情報