0

現在、複数の実行可能ファイル(ボイスチャットサーバー)を生成するために使用している小さなPythonスクリプトがあり、ソフトウェアの次のバージョンでは、サーバーはUDPポートでハートビート信号を受信する機能を備えています。(ポート7878以上の範囲で、1台のマシンに数千台のサーバーが存在する可能性があります)

私の問題は、これらのサーバーがPythonスクリプトと同じマシンで実行されている可能性があり、UDPポートを開き、ハートビートを送信して応答を待つことを計画していたことです。タスクを強制終了してサーバーを再ロードすることにより、サーバーが応答しなかった場合にサーバーを再起動します。

問題は、サーバーがすでに使用しているUDPポートを開くことができないことです。これを回避する方法はありますか?プロジェクトリーダーはまだハートビートを実装しているので、ハートビートシステムを実装する方法についての提案も歓迎されると確信しています。--これはかなり一般的なスクリプトですが、他のプログラムにも適用される可能性があるため、私の主な焦点は引き続きそのUDPポートでの通信です。

4

2 に答える 2

2

これは不可能です。あなたがしなければならないことは、1 つのポートを介してすべての UDP 通信を処理し、別の方法でサーバーと通信する 1 つの UDP マスター プログラムを用意することです (別のポートでの UDP、名前付きパイプなど)。

于 2009-11-12T15:26:37.593 に答える
1

これは Linux でも可能だと確信しています。他の UNIX については知りません。

あるプロセスから別のプロセスにファイル記述子を伝搬するには、次の 2 つの方法があります。

  • プロセスが fork() すると、子は親のすべてのファイル記述子を継承します。
  • プロセスは、「UNIX ドメイン ソケット」を介してファイル記述子を別のプロセスに送信できます。sendmsg()およびrecvmsg( ) を参照してください。Python では、_multiprocessing拡張モジュールがこれを行います。とを参照_multiprocessing.sendfd()してください_multiprocessing.recvfd()

UDP ソケットをリッスンする複数のプロセスを試したことはありません。しかし、TCP の場合、Linux では、複数のプロセスがすべて 1 つの TCP ソケットをリッスンしている場合、接続が入ったときにそのうちの 1 つがランダムに選択されます。したがって、複数のプロセスがすべて同じ UDP ソケットをリッスンしている場合、Linux は賢明なことをしていると思います。

試してみて、私たちに知らせてください!

于 2009-11-12T16:47:22.847 に答える