3

C# ベースのクライアント サーバー アーキテクチャがあります。クライアントはサーバーに接続し、データを交換します。

サーバーのステータスを継続的に確認する必要があり、サーバーがダウンした場合 (ネットワークから削除されたか、シャットダウンされた場合)、クライアントはそれを示す必要があります。

クライアント プログラムでユーティリティを使用Pingしている場合、パフォーマンスの点で最適な方法はどれですか。つまり、別のスレッドを介して監視するか、バックグラウンド クラスを介して監視しますか?

public static bool GetPingResponse(string IpAddress, int timeout = 3000)
{
    var ping = new Ping();
    var reply = ping.Send(IpAddress, timeout); 
    if (reply.Status == IPStatus.Success)
    {
        return true;
    }
    else
    {
        return false;
    }
}

パフォーマンスとリソース消費の点で、Ping よりも優れたオプションはありますか?

4

1 に答える 1

3

電話が「対応可能」であることを確認する必要があります。たとえば、http サーバーの場合、ping 要求を行うと、ネットワーク経由で到達可能であることが示されます。Web サーバーがダウンしている可能性がありますが、ネットワーク スタックはアップしています。その場合は、http などのスタックをさらに活用するものを呼び出します。バックエンド データベースがある場合、呼び出しはデータベース サーバーに到達する可能性があります。それはすべて、「利用可能」の定義に依存します。アプリケーションが利用可能であるということが重要な場合は、完全なスタックを介してパスを実行する呼び出しを調べる必要があります。

また、サーバーが利用できるものと、クライアントとサーバー間のファイアウォールを介して何が開いているかにも依存します。

Ping は、一部のサイトがファイアウォール経由でブロックすることを選択する ICMP を使用します。それが開いている場合、オーバーヘッドがほとんどない安価な通話です。

それがブロックされていて、たとえば http を介した Web サーバーである場合、C# の http クライアントを介して呼び出すことができる安価なエンドポイントを Web サーバー上に持つことができます。

おそらくタイマーを使用して、バックグラウンド スレッドでポーリングする必要があります。BackgroundWorker クラスまたはThreadPool.QueueUserWorkitemを調べます。

最後に、監視ソリューションを調べることができます。サーバーの複数の側面を監視できるソリューションがたくさんあります。そのルートに行く場合、クライアントは単に監視ソリューションにクエリを実行できます。これは、サーバーをポーリングする n クライアントがなく、監視スタックが 1 つしかないため、より優れている可能性があります。

ちなみに、コードの最後のブロックは次のように簡略化できます。

return reply.Status == IPStatus.Success;
于 2012-11-17T13:21:45.537 に答える