2011-03-16 95 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给出了网络信息。

相关问题