2009-04-29 11 views
14

C#2008C#アクティブなインターネット接続をテストしています。 pinging google.com

私はこのコードを使用してインターネット接続をテストしています。私のアプリケーションはWebサーバーにログインする必要があります。ただし、ユーザーのインターネット接続が失敗したり、ケーブルが引き抜かれたりした場合。私はユーザーに通知する必要があります。

// Ping www.google.com to check if the user has a internet connection. 
    public bool PingTest() 
    { 
     Ping ping = new Ping(); 

     PingReply pingStatus = ping.Send(IPAddress.Parse("208.69.34.231")); 

     if (pingStatus.Status == IPStatus.Success) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

私がインターネット接続をテストできる唯一の方法は、www.google.comにpingすることです。だから、私は500ミリ秒のために設定したサーバタイマーを使用しており、経過イベントではこのping関数を呼び出します。 pingがfalseを返す場合その後、私のアプリは適切な行動を取るでしょう。

あなたはインターネット接続をテストする方法としてgoogleを使用することは良いことだと思いますか? Googleが失敗すると、私のアプリは機能しませんでした。ポーリングの1/2秒は多すぎるか少なすぎますか?それが良いかどうか私の考え全体について疑問に思っているだけですか?

多くのおかげで、

+12

他のものとは別に、そのようなif文を使用しないでください。コードの最後の8行を "return pingStatus.Status == IPStatus.Success;"に変更します。 –

+3

私は残念なことにあなたのために良い答えがありませんが、0.5秒ごとにサイトにpingをしたくない場合、ブロックされてしまうかもしれません。 –

+0

任意のホストを選択する場合は、一連のホストを試すことをお勧めします。 www.google.com、www.live.com、www.yahoo.comなど。すべてが失敗した場合にのみユーザーに通知します。ルーターがユーザーとGoogleの間に落ちても、インターネットに接続されている場合、接続が切断されていると間違って通知することは望ましくありません。 – esac

答えて

23

なぜGoogleにpingを実行しますか?あなたが本当に気にしている唯一のサーバーは、話したいWebサーバーです。代わりにそれをpingしてください。そうすれば、ユーザーとWebサーバーの間に何か問題がある場合にユーザーに通知することができます - それが重要なことです。

インターネットに何か問題が発生した場合、ユーザーは自分の街で何かしかできない場合は、Googleにアクセスできない可能性がありますが、興味のあるウェブサーバーにアクセスできる場合は、問題?一方、WebサーバーがダウンしてもGoogleが応答しない場合、なぜでないのですか?に問題があることをユーザーに伝えたいですか?

同様に、なぜpingを使用しますか?なぜWebサーバー上の既知のURLにHTTPリクエストを送信しないのですか?結局のところ、ネットワークが稼働しているにもかかわらず、Webサーバープロセス自体がダウンしている場合は、必ずしもユーザーのネットワークがダウンするほど悪いことです。

編集:私はあなたがこれを1/2秒ごとに繰り返すという質問に気づいていませんでした。それは本当に誰にとっても楽しいことではありません。確かに1分に1回は十分な場合が多いですね。

+4

サーバへのpingに失敗した場合は、Googleにpingを送信します。そうすれば、ユーザーはネット上にいるのかどうかを知ることができますが、サーバーはダウンしています。 –

+0

セキュリティ上の理由から、Webサーバーでping(icmp)が無効になっています。私はポート番号でWebサーバーをテストするソケットを作成しました。しかし、それは非常に遅く応答しました。 – ant2009

+1

どちらのポートですか?あなたが気にしているのは、確かにWebリクエストを聞いている人だけです。 –

1

時々あなたlataencyが高く得ることができるので、それは、0.5秒以上のものを置くことをお勧めしたいです。私は時にはDSL上で3.5sさえ持っています。

2

私は何かが不足している可能性がありますが、使用する前にサーバーが稼動しており、Webサービスが稼働していることをテストする必要がありますか?あなたのWebサービスでメソッドを呼び出してもタイムリーな応答が得られない場合は、これまでどおりに必要なアクションを取ってください。

デザインの工学上のようです。

[編集]

robukを説明してくれてありがとう。 NET Rocksのポッドキャストエピソード「Udi Dahan Scales Web Applications!」を聞くべきです。 (2008年12月12日日付)。彼らは、要求にGUIDを追加することについて議論し、応答で同じGUIDを取得するまで待機します。たぶんあなたは毎秒10回試してみるといいでしょう.10回試しても応答が返ってこない場合は(GUID付き)、必要な処置を取ってください。

それで頑張ってください。..

+0

こんにちは。アプリは、何かが発生したとき、私のアプリが適切な処置をとるように、常に監視する必要があります。私はpinging googleをテストしました。しかし、私はこれが良いアイデアだとは思わない。あたかもpingが一度だけ失敗したかのように、私は数秒ごとにpingを実行しています。その後、アプリケーションは、インターネット接続が失われていると考えて、行動を取る。 – ant2009

2

私は似た何かをする必要があるアプリを持っています。私たちは、ポッド/サブメッセージバスという、別のアーキテクチャのビットを持っています。様々なサービスからの "ハートビート"を聞くことに関心のあるアプリケーションのために、彼らはバスに関心を登録することができます。数秒ごとに、各サービスは、消費者が受け取る状態メッセージを公開します。消費者が一定期間健康状態メッセージを受信しない場合、消費者は再び健康状態メッセージを聞くまで適切な処置を取ることができます。

この設定は、サーバーのポーリングやそれ以上のpingの実行よりもはるかに拡張性があります。 100または1000のクライアントがすべて数秒ごとにあなたのサーバーをポーリングまたはpingしたとします。悪い。

+0

良い解決策のように聞こえる、実装が難しいですか? – Skittles

+0

本当は...あなたが兄弟のジュヴァルのサンプルコード(http://msdn.microsoft.com/en-us/magazine/cc163537.aspx)を入手すると、非常に速く実行されている配管のモックアップを持つことができます。私たちが運営するOTOHのサービスは優雅なものです。 :) –

+0

はい、あなたは正しいです。これらのクライアントすべてに単一のWebサイトをpingするのは悪い考えです。しかし、私はこれをやったことがないので、これを行うためのさまざまな方法を探しています。私はすぐに記事をスキャンしました。私は、クライアントがサービスに加入すると思うのは正しいですか。 Webサーバーがダウンすると、サービスはクライアントにコールバックして通知します。これに他の記事がありますか?私は、クライアントが回線を切ってコールバックをサービスに送ることができれば、デュプレックスになると思います。 – ant2009

6

PINGを必要としない良い答えを持って、この重複質問チェックアウト:ときにのみ、その後、System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChangedイベントにサブスクライブし、可能性が

C# - How do I check for a network connection

をネットワークがダウンしていることを示して、サーバにping/webリクエストを送信して、利用可能かどうかを確認します。

1

あなたがネットワークに接続しているかどうかは、pingを実行しているサーバーを悩ませるよりも良いでしょう。例えば、Detect Internet V. local lan connectionを参照してください。 Windows 7/Server 2008 R2を使用している場合は、接続が変更されたときにイベントを受け取ることができます。これは、一定のpingやポーリングよりもずっと幸せになるでしょう。

2

あなたは単に私はあなたのウェブサーバをpingすることは私はスローにしたい最高のアイデアかもしれないとジョンに同意

http://net-informations.com/csprj/communications/internet-connection.htm

+0

私はこの方法を信頼しません。なんらかの理由で、このメソッドはLANコントローラが無効になっている間も(trueを返します)(Windows 8.1 x64) – itsho

0

にもかかわらず、この

[DllImport("wininet.dll")] 
private extern static bool InternetGetConnectedState(out int conn, int val); 

C#の完全なソースコードのようにテストすることができます単独で使用される可能性のある別のソリューションまたはサービスへの最初のpingと共に使用される可能性があります。

これらは、NetworkAvailabilityChangedと呼ばれるNetworkChangeクラスの組み込みイベントで、オンラインであるかどうかに関わらず、Windowsから全体的なステータスを取得できます。リスナーを追加するだけで、リスナーが変更されると通知されます。

private void MyForm_Load(object sender, EventArgs e) 
{ 
    NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged); 
} 

private void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
{ 
    if (e.IsAvailable) 
    { 
     WriteLog("Network is available again, updating items"); 
     timer1_Tick(sender, EventArgs.Empty); 
     return; 
    } 

    WriteLog("Network isn't available at the moment"); 
} 

.Net 2.0以降で利用できます。詳細はMSDNにあります。

関連する問題