2012-12-27 18 views
2

我希望我的應用程序在連接可用時連接到服務器(以檢查更新),但當連接不可用時不做任何事情。我擔心撥號連接的人可能會收到其中一個提示,以便在我的程序嘗試這種情況時撥打他們的ISP。我意識到現在很少有人在撥號,但仍然如此。如何在不提示撥號對話框的情況下檢查互聯網連接是否可用?

我自己已經撥號超過十年了,所以我真的不知道在離線狀態下執行HTTP請求(例如使用WebRequest)是否會顯示這樣的「撥號」提示。會嗎?如果是這樣,我如何檢查更新而不會導致這樣的提示?

+0

撥號連接的人?如果他們不買真正的互聯網連接,是什麼讓你認爲他們會購買你的軟件? –

+4

@HighCore幫你一個忙,並停止編寫代碼。大多數人生活在農村去網吧/星巴克/無論下載軟件/購買帶有軟件的CD/DVD。 – Woot4Moo

+0

爲什麼關於撥號提示的提示? – Woot4Moo

回答

1

通過使用這樣的:

My.Computer.Network.IsAvailable 

也許這樣的:

Dim available As Boolean 
    Try 
     Dim client As New System.Net.Sockets.TcpClient("google.com", 80) 
     available = True 
    Catch ex As Exception 
     available = False 
    End Try 

如果結果爲「可用」,你可以檢查更新是否可用。

+0

你有證據證明這不會導致撥號對話框彈出嗎? –

+0

就你而言,我一定會用第一個。既然它與試圖建立聯繫無關,我可以說我95%確定。然而我沒有證據:( – theGD

+0

LJVanKuiken建議'IsAvailable'在底層調用'InternetGetConnectedState',並且至少有一個[comment](http://stackoverflow.com/questions/11320366/internetgetconnectedstate-and-it-應該不會被使用從服務聲明-f#comment14901430_11320572),這表明這個調用將導致撥號提示。 –

0

WinInet Api實現功能:specfic API調用的

BOOL InternetGetConnectedState(
    _Out_ LPDWORD lpdwFlags, 
    _In_ DWORD dwReserved 
); 

詳細信息,可以發現here


編輯: 我提供了一個小的代碼示例,可用於測試。
值得注意的是,在引擎蓋下,My.Computer.Network.IsAvailable P /調用InternetGetConnectedState,並簡單地返回真/假值,同時丟棄標誌。 WinNt,後來它通過網絡接口進行枚舉,併爲第一個連接的接口返回true。

using System; 

namespace InternetGetConnectedState 
{ 
    [Flags] 
    enum InternetConnectionFlags : uint 
    { 
     // Flags for InternetGetConnectedState and Ex 
     Modem = 0x01, 
     Lan = 0x02, 
     Proxy = 0x04, 
     ModemBusy = 0x08, /* no longer used */ 
     RasInstalled = 0x10, 
     Offline = 0x20, 
     Configured = 0x40 
    } 

    class Program 
    { 
     [System.Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)] 
     static extern bool InternetGetConnectedState(out InternetConnectionFlags flags, uint dwReserved); 

     static void Main(string[] args) 
     { 
      InternetConnectionFlags flags; 
      bool connectedState = InternetGetConnectedState(out flags, 0) 

      // TODO: Check Flags 
     } 
    } 
} 

編輯2: 經過進一步審查的ILSpy轉儲,在Windows My.Computer.Network.IsAvailable P /調用InternetGetConnectedState之前NT。在WinNt和更高版本中,它通過網絡接口枚舉併爲第一個連接的接口返回true。所以,要麼

My.Computer.Network.IsAvailable 'vb.net 

System.Net.NetworkInformation.GetIsNetworkAvailable(); // C# 

是可行的解決方案。

也許一種禁用自動更新的選項是避免最終用戶煩惱的另一種可能的解決方案。

+0

至少有一個[評論](http://stackoverflow.com/問題/ 11320366/internetgetconnectedstate-it-it-it-it-not-be-used-from-a-service-statement -f#comment14901430_11320572)暗示此調用**將導致撥號提示 –

+0

@romkyns There沒有任何證據證實這個斷言,微軟不支持實現WinInet API的服務,因爲Api的*部分*需要用戶交互和服務實現來禁止。 –