2012-03-09 162 views
0

我試圖ping一個使用Ping類的服務器,但在10次之後,該方法返回true,我總是收到錯誤(這意味着服務器關閉了[?],它不是)下面是方法:使用C#ping服務器使用C#

 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); 


     } 
    } 

爲什麼我在一段時間後一直變得虛假? 謝謝。快

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

將循環的請求後,可以發送請求:

+3

您的異常處理是最糟糕的我」在很長一段時間裏已經見過。不要理解這個例外:http://blog.gauffin.org/2010/11/do-not-catch-that-exception/。而'IsConnectedToInternet'應該是一個方法'CheckConnection()'而不是屬性。 – jgauffin 2012-03-09 13:05:55

+2

請考慮將其移至方法。預計房產沒有成本。 – 2012-03-09 13:06:33

+0

在你的'Catch'子句中,嘗試'Catch(Exception ex){Console.WriteLine(Ex.Message.toString())}'看看會發生什麼。 – 2012-03-09 13:08:01

回答

10

你充斥服務器的請求。

如果你只是編寫一個保持活着的服務或服務狀態控制,然後使用計時器,每分鐘甚至每10分鐘應該是足夠好的。

另外,正如其他人在他們的評論中指出的那樣,通過在獲取者中執行ping操作來濫用屬性,因爲調用可能需要一些時間,並且屬性獲取者應該真的返回,即使不是立即很快。一個CheckConnection()方法會有更明確的意圖。

+0

對不起,但我並不真正瞭解你在說什麼,你說超時應該至少1分鐘? – idish 2012-03-09 13:12:01

+0

他說你每10ms輪詢一次服務器,如果ping需要這麼長時間的話。因此淹沒它。 – jgauffin 2012-03-09 13:15:38

+0

@idish - no。你太常打電話了。使用計時器來控制ping何時發生。 – ChrisF 2012-03-09 13:15:58

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 2012-03-09 13:23:05

+0

因爲超時仍然是1000毫秒,而且我需要多久調用一次這些方法? – idish 2012-03-09 13:24:23

+0

超時時間爲1000毫秒,但***輪詢間隔***爲10秒。您用'for'循環發送服務器垃圾郵件。 – jgauffin 2012-03-09 13:26:39

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");