3

クライアントアプリとサーバーアプリを開発しました。クライアントは http プロトコルを使用してサーバーと通信し、サーバーによって処理されるデータを送信します。

私たちの構造により、サーバーをどこにでもインストールできます。同じクライアント ネットワークにいることも、クラウドにいることもできます。

サーバーがクラウドでホストされている場合、ユーザーにサーバー アドレスを要求するのは理にかなっていますが (ユーザーが望む場合は変更できるため)、サーバーがクライアントと同じネットワーク上にある場合は意味がありません。それに加えて、現在、サーバーに接続するためにサーバーの ip/name を構成するようにユーザーに求めています。

これを回避するために (ユーザーにアドレスを尋ねる)、UDP に基づく検出サービスを開発しました。クライアントは、サーバーがそのアドレスで応答するメッセージをブロードキャストします。場合によっては機能しますが、ユーザーが何らかの種類のファイアウォール、プロキシ、またはウイルス対策を使用している場合は機能しません。

私は発見サービスについてたくさん読んだことがありますが、最も好きなものはBonjourです。

問題は、サーバーがファイアウォールやプロキシなどによってブロックされずにクライアントと同じネットワーク上にある場合、サーバーの IP を検出する最良の方法は何ですか?

4

1 に答える 1

1

サービスを(イントラネット内で)純粋にローカルに保ち、ホールパンチングを実装することで、現在使用しているものの上に構築できます。ファイアウォールを通過することはできますが、AVソフトウェアポリシーについてはよくわかりません。

または、インターネットで有名なhttpベースの検出サービスを確立することもできます。

  1. サーバーが稼働し、その(ローカル)IPアドレスを検出サービスに送信します(keep-alivesを送信し続けます)
  2. 起動時に、クライアントはその検出サービスにクエリを実行し、自分がいるローカルサブネットを識別して、サーバーのローカルIPアドレスを取得します。

もちろん、検出サービスがバケットをキックすると、クライアントがサーバーを見つけることができないという点で、システムに単一障害点が生じます。サービスを複製したり、フォールバックメカニズム(純粋にローカルな検出など)を導入したりすることで、これを修正できます。これは、とにかく実行したいと思うでしょう。ローカルサブネット内のコンピューターが外部IPアドレスを共有しない場合の唯一の問題はサブネットの識別です(ローカルサブネットが何であるかによって異なります)。

于 2012-06-09T16:20:17.687 に答える