2012-03-09 20 views
0

Pingクラスを使用してサーバーにpingを実行しようとしていましたが、メソッドがtrueを返す10回後に、私はfalseを取得し続けます(サーバーがダウンしています)方法は次のとおりです。C#を使用してサーバーにpingを実行する

 public bool IsConnectedToInternet() 
    { 
      Ping p = new Ping(); 
      try 
      { 

       PingReply reply = p.Send("www.uic.co.il", 1000); 
       if (reply.Status == IPStatus.Success) 
        return true; 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.Message.ToString());  
      } 
      return false; 
    } 

    private void start_Click(object sender, EventArgs e) 
    { 
     for (; ;) 
     { 
      Console.WriteLine(IsConnectedToInternet); 


     } 
    } 

なぜ私はしばらくすると偽になりますか? ありがとうございます。

+3

あなたの例外処理は最悪I」であります長い間見られた。例外を捕まえないでください:http://blog.gauffin.org/2010/11/do-not-catch-that-exception/また、 'IsConnectedToInternet'は' CheckConnection() 'メソッドであり、プロパティではありません。 – jgauffin

+2

これをメソッドに移動することを検討してください。プロパティにはコストがかかりません。 –

+0

'Catch'節で' Catch(Exception ex){Console.WriteLine(Ex.Message.toString())} 'を実行して何が起こるかを見てください。 –

答えて

10

あなたは要求してサーバーを氾濫している:要求した後にリクエストを送信し、できるだけ速く

for (; ;) 
{ 
    Console.WriteLine(IsConnectedToInternet); 
} 

意志ループ。

キープアライブサービスまたはサービスステータスコントロールをコーディングする場合は、毎分または10分ごとにピングするタイマーを使用するだけで十分です。

また、他の人がコメントに指摘しているように、呼び出しに潜在的に時間がかかる可能性があるため、getterでpingを実行することによってプロパティを酷使しています。 CheckConnection()メソッドは、より明確な意図を持っていました。

+0

申し訳ありませんが、私はあなたが言っていることを本当に理解していませんでした。タイムアウトは少なくとも1分でなければならないと言いますか? – idish

+0

pingに長時間かかる場合は、10msごとにサーバーをポーリングすると言っています。したがって、それを洪水します。 – jgauffin

+0

@idish - no。あなたはpingをあまりにも頻繁に呼びます。タイマーを使用して、pingの発生を制御します。 – ChrisF

1

コードを書き換えました。

接続が失われた場合はConnectionLostというイベントをトリガーし、もう一度接続するとConnectedというイベントをトリガーします。このページ全体につまずくその他については

public class NetworkStateMonitor 
{ 
    private System.Threading.Timer _timer; 
    bool _wasConnected = false; 

    public NetworkStateMonitor() 
    { 
     _timer = new System.Threading.Timer(OnPing, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); 
    } 

    public bool CheckInternetConnection() 
    { 
     bool result = false; 
     Ping p = new Ping(); 
     try 
     { 
      PingReply reply = p.Send("www.uic.co.il", 1000); 
      if (reply.Status == IPStatus.Success) 
       return true; 
     catch (PingException) 
     { 
      return false; 
     } 
    } 


    private void OnPing(object state) 
    { 
     var newState = CheckInternetConnection(); 
     if (!newState && _wasConnected) 
      ConnectionLost(this, EventArgs.Empty); 
     else if (newState && !_wasConnected) 
      Connected(this, EventArgs.Empty); 

     _wasConnected = newState; 
    } 

    public event EventHandler ConnectionLost = delegate{}; 
    public event EventHandler Connected = delegate{}; 
} 
+0

私を助けようと努力してくれてありがとう、私は本当にこのコードを理解していない、2つのイベントを作成しましたか?このコードは私のために働くでしょうか? – idish

+0

タイムアウトはまだ1000ミリ秒であり、これらのメソッドをどれくらい頻繁に呼び出す必要があるのでしょうか? – idish

+0

タイムアウトは1000msですが、***ポーリング間隔***は10秒です。 'for'ループでサーバーをスパムしました。 – jgauffin

0

それが書き直された場合、この機能は良いだろう:

public bool CheckInternetConnection(string HostName) 
{ 
    bool result = false; // assume error 
    try { 
     Ping oPing = new Ping(); 
     PingReply reply = oPing.Send(HostName, 3000); 
     if (reply.Status == IPStatus.Success){ 
      result = true; 
     } 
    } catch (Exception E) { 
     // Uncomment next line to see errors 
     // MessageBox.Show(E.ToString()); 
    } 
    return result; 
} 

今使って呼び出す:

bool IsSuccessful = CheckInternetConnection("www.uic.co.il"); 
関連する問題