2011-03-16 77 views

回答

6

如果你可以用芒果(7.1)SDK,如果你的方案涉及到使用套接字,有一個簡單的方式來獲得該連接的NetworkInterfaceType /子類型信息,您剛纔提出:

NetworkInterfaceInfo netInterfaceInfo = socket.GetCurrentNetworkInterface(); 
    var type = netInterfaceInfo.InterfaceType; 
    var subType = netInterfaceInfo.InterfaceSubtype; 

無需以使用NetworkInterface.NetworkInterfaceType屬性(這出乎意料地需要30秒才能返回);無需爲了確定網絡類型而觸發主機名解析;無需收聽網絡更改事件。

當然,這與DeviceNetworkInformation.IsNetworkAvailable或NetworkInterface.GetIsNetworkAvailable()一起使用效果最好 - 無論您是否在網絡上,這些調用都會立即返回。如果是的話,你先連接插座,並在連接時詢問問題:-)

最後一點:謹防Mango的DeviceNetworkInformation.IsWiFiEnabled - 我認爲它會返回我是否在無線網絡上,但它會返回無論在手機設置中是否打開或關閉無線網絡......都不是非常有用。

+0

我會說DeviceNetworkInformation.IsCellularDataEnabled相同。即使手機中沒有SIM卡,它也會返回true。似乎只是關於天線的狀態,而不是實際的連接。 – djcouchycouch 2013-05-17 17:42:16

+2

如何獲取套接字? – Yoda 2014-02-07 01:52:27

1

不幸的是,API的不提供非常有限有關您擁有的網絡連接種類的信息。您可以判斷您是否使用3G,Cellular或以太網(即USB連接到PC),但這是您獲得的所有信息。

看看這個更多信息Better way to check for an network connection on WP7

+0

我怎麼知道我是否在3G上? – 2013-02-12 12:15:39

2

由於芒果版本(Beta 2和RC)的,這些信息現在可用,但它需要你真正建立連接,大概是因爲它不檢查,直到有些東西需要它。

您可以執行DNS解析(請參閱下文)或使用GetCurrentNetworkInterface WebRequest擴展方法,如果請求尚未連接,將引發InvalidOperationException。

Microsoft.Phone.Net.NetworkInformation命名空間中還有一些事件需要關注,但是如果這些事件在連接建立之前沒有觸發,我不會感到驚訝。

有趣的是,您似乎也可以使用SetNetworkPreferenceSetNetworkRequirement擴展方法在每個連接的基礎上選擇或要求使用擴展方法,但它不會超越wifi和蜂窩。

DeviceNetworkInformation.ResolveHostNameAsync(
      new DnsEndPoint("microsoft.com", 80), 
      new NameResolutionCallback(nrr => 
       { 
        var info = nrr.NetworkInterface; 

        var type = info.InterfaceType; 
        var subType = info.InterfaceSubtype; 
       }), null); 

NetworkInterfaceType爲(WIFI/GSM)和NetworkInterfaceSubType(邊緣/ 3G)的枚舉值可在MSDN。

2

沒有插座:

var currentList = new NetworkInterfaceList().Where(i => i.InterfaceState == ConnectState.Connected).Select(i => i.InterfaceSubtype); 
if (currentList.Contains(NetworkInterfaceSubType.WiFi)) 
    Debug.WriteLine("WiFi"); 
if (currentList.Intersect(new NetworkInterfaceSubType[] 
{ 
    NetworkInterfaceSubType.Cellular_EVDO, 
    NetworkInterfaceSubType.Cellular_3G, 
    NetworkInterfaceSubType.Cellular_HSPA, 
    NetworkInterfaceSubType.Cellular_EVDV, 
}).Any()) 
    Debug.WriteLine("3G"); 
if (currentList.Intersect(new NetworkInterfaceSubType[] 
{ 
    NetworkInterfaceSubType.Cellular_GPRS, 
    NetworkInterfaceSubType.Cellular_1XRTT, 
    NetworkInterfaceSubType.Cellular_EDGE, 
}).Any()) 
    Debug.WriteLine("2G"); 
+0

在某些地方輸入錯誤NetworkInterfaceSubtype應該是NetworkInterfaceSubType – giacoder 2014-12-03 12:53:06

+0

希望它現在已經修復。 – 2014-12-04 13:14:58

0

爲Windows手機應用程序獲取網絡數據即它連接到以太網,WiFi或蜂窩網絡也越來越亞型即2G或3G網絡下面的程序都可以使用。

Using Microsoft.Phone.Net.NetworkInformation 

Using Microsoft.Phone.net.NetworkInfromation 

var Newlist = new NetworkInterfaceList(); 

foreach (NetworkInterfaceInfo x in Newlist) 

{ 

if(x.InterfaceState==ConnectState.Connected) 

{ 

if(x.InterfaceSubtype.Equals(NetworkInterfaceSubType.WiFi)) 

{ 

Interface = x.InterfaceType.ToString(); 

SubInterface = x.InterfaceSubtype.ToString(); 

break; 

} 

else if(x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_EVDO) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_3G) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_HSPA) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_EVDV)) 

{ 

Interface = x.InterfaceType.ToString(); 

SubInterface= 「3G Network」; 

break; 

} 

else if(x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_GPRS) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_1XRTT) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_EDGE)) 

{ 

Interface = x.InterfaceType.ToString(); 

SubInterface= 「2G Network」; 

break; 

} 

else 

{ 

Interface = 「Ethernet」; 

SubInterface= 「Unknown」 ; 

break; 

} 

} 

else 

{ 

Interface=」not connected」; 

SubInterface=」unknown」; 

} 

這裏Interface和SubInterface給出了網絡信息。

相關問題