Windows mobile windows mobile:检查网络是否可用

Windows mobile windows mobile:检查网络是否可用,windows-mobile,Windows Mobile,如何检查windows mobile 6.5+设备上是否有互联网 谢谢。像这样的东西。本质上,这是来自2005年1月12日的MSDN提示和技巧网络广播。为了符合我自己的标准,它被稍微重写了一下,而且完全没有经过测试,但是你明白了。随便用 enum ConnectionStatus { Offline, OnlineTargetNotFound, OnlineTargetFound, } ConnectionStatus GetConnectionStatus(Strin

如何检查windows mobile 6.5+设备上是否有互联网


谢谢。

像这样的东西。本质上,这是来自2005年1月12日的MSDN提示和技巧网络广播。为了符合我自己的标准,它被稍微重写了一下,而且完全没有经过测试,但是你明白了。随便用

enum ConnectionStatus
{
    Offline,
    OnlineTargetNotFound,
    OnlineTargetFound,
}

ConnectionStatus GetConnectionStatus(String url)
{
    try
    {
        //
        // If the device is set to loopback, then no connection exists.
        //
        String hostName = System.Net.Dns.GetHostName();
        System.Net.IPHostEntry host = System.Net.Dns.GetHostByName(hostName);
        String ipAddress = host.AddressList.ToString();

        if(ipAddress == System.Net.IPAddress.Parse("127.0.0.1").ToString())
        {
            return ConnectionStatus.Offline;
        }

        //
        // Now we know we're online. Use a web request and check
        // for a response to see if the target can be found or not.
        // N.B. There are blocking calls here.
        //
        System.Net.WebResponse webResponse = null;
        try
        {
            System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url);
            webRequest.Timeout = 10000;
            webResponse = webRequest.GetResponse();

            return ConnectionStatus.OnlineTargetFound;
        }
        catch(Exception)
        {
            return ConnectionStatus.OnlineTargetNotFound;
        }
    }
    catch(Exception)
    {
        return ConnectionStatus.Offline;
    }
}

下面是一段源于同一网络广播的代码。用法应该非常简单。尽管它可以作为networkwatcher,在检测到连接可用性时通知您,但您可以选择仅提取isurlavable函数

using System; using Microsoft.WindowsMobile.Status; using System.IO; using System.Net; using System.Windows.Forms; using System.Threading; namespace RAMIS2.Classes { class NetworkWatcher : IDisposable { public delegate void NetworkStatusDeterminedDelegate(bool remoteServerReachable, bool internetReachable); public event NetworkStatusDeterminedDelegate NetworkStatusDetermined; SystemState nw = null; const string _remoteServerExpectedText = @"RAMIS"; Uri InternetUrl = new Uri(@"http://www.google.com"); const string _internetReachableExpectedText = @"Google"; const int sleepTimeBetweenConnectTries = 15000; const int maxConnectTryCount = 2; Uri _remoteServerUrl = new Uri("https://demo.mywebsite.com/test.txt"); bool internetReachable; bool remoteServerReachable; Thread bgw; public void Dispose() { if (bgw != null) { bgw.Abort(); bgw = null; } if (nw != null) { nw.Changed -= NetworkWatcher_Changed; nw.Dispose(); nw = null; } } Control invoke_ctrl; public NetworkWatcher() { invoke_ctrl = new Control(); } public void Start() { // This only works for Windows Mobile 5.0 and higher, not PPC 2003 if (Environment.OSVersion.Version >= new Version(5, 0)) { nw = new SystemState(SystemProperty.ConnectionsCount, false); nw.Changed += new ChangeEventHandler(NetworkWatcher_Changed); } bgw = new Thread(DetermineNetworkState); bgw.Start(); } void NetworkWatcher_Changed(object sender, ChangeEventArgs args) { // instantly test new connection status if (bgw != null) DetermineNetworkState(); } public bool IsUrlReachable(Uri url, string expectedText) { bool isUrlReachable = false; HttpWebRequest httpRequest = null; HttpWebResponse httpResponse = null; Stream responseStream = null; StreamReader responseReader = null; for (int connectTryCount = 0; !isUrlReachable && connectTryCount = 0; } catch (SystemException) { } finally { if (responseReader != null) responseReader.Close(); if (responseStream != null) responseStream.Close(); if (httpResponse != null) httpResponse.Close(); } if (!isUrlReachable) Thread.Sleep(sleepTimeBetweenConnectTries); } return isUrlReachable; } void DetermineNetworkState() { try { while (true) { if (Environment.OSVersion.Version >= ST.WM5.Version) DetermineNetworkStateInternal(SystemState.ConnectionsCount); else DetermineNetworkStateInternal(1); // invoke on GUI thread invoke_ctrl.BeginInvoke(new NetworkStatusDeterminedDelegate(NetworkStatusDetermined), remoteServerReachable, internetReachable); Thread.Sleep(sleepTimeBetweenConnectTries); } } catch (ThreadAbortException) { } } void DetermineNetworkStateInternal(int connectionsCount) { if (connectionsCount > 0) { remoteServerReachable = IsUrlReachable(_remoteServerUrl, _remoteServerExpectedText); internetReachable = remoteServerReachable ? true : IsUrlReachable(InternetUrl, _internetReachableExpectedText); } else remoteServerReachable = internetReachable = false; } } } 使用制度; 使用Microsoft.WindowsMobile.Status; 使用System.IO; Net系统; 使用System.Windows.Forms; 使用系统线程; 名称空间2.class{ 类NetworkWatcher:IDisposable{ public delegate void networkstatus determinatedDelegate(bool remoteServerReachable,bool internetReachable); 公共事件网络状态已确定远程事件网络状态已确定; SystemState nw=null; 常量字符串\u remoteServerExpectedText=@“RAMIS”; Uri InternetUrl=新Uri(@“http://www.google.com"); 常量字符串\u internetReachableExpectedText=@“谷歌”; const int sleepTimebetweenConnections=15000; 常量int maxConnectTryCount=2; Uri\u remoteServerUrl=新Uri(“https://demo.mywebsite.com/test.txt"); 布尔可互连; 布尔远程服务器可达; 螺纹bgw; 公共空间处置(){ 如果(bgw!=null){bgw.Abort();bgw=null;} 如果(nw!=null){nw.Changed-=NetworkWatcher_Changed;nw.Dispose();nw=null;} } 控件调用&u-ctrl; 公共网络观察者(){ invoke_ctrl=new Control(); } 公开作废开始(){ //这仅适用于Windows Mobile 5.0及更高版本,不适用于PPC 2003 如果(Environment.OSVersion.Version>=新版本(5,0)){ nw=新系统状态(SystemProperty.ConnectionsCount,false); nw.Changed+=新的ChangeEventHandler(NetworkWatcher\u已更改); } bgw=新线程(工作状态); bgw.Start(); } void NetworkWatcher_已更改(对象发送方,changeventargs args){ //立即测试新的连接状态 如果(bgw!=null)DetermineNetworkState(); } public bool可访问(Uri url,字符串expectedText){ bool-isurleachable=false; HttpWebRequest httpRequest=null; HttpWebResponse httpResponse=null; Stream responseStream=null; StreamReader responseReader=null; 对于(int connectTryCount=0; !isUrlReachable&&connectTryCount=0; } 捕获(系统异常){} 最后{ if(responseReader!=null)responseReader.Close(); if(responseStream!=null)responseStream.Close(); if(httpResponse!=null)httpResponse.Close(); } if(!isUrlReachable)Thread.Sleep(SleepTimeBetweenConnections); } 返回是可到达的; } void DetermineNetworkState(){ 试一试{ while(true){ if(Environment.OSVersion.Version>=ST.WM5.Version)DetermineNetworkStateInternal(SystemState.connectionscont); 其他确定为内部状态(1); //在GUI线程上调用 调用\u ctrl.BeginInvoke(新的网络状态已确定Delegate(网络状态已确定)、RemoteServerReach、InternetReach); 睡眠(连接之间的睡眠时间); } } 捕获(线程异常){} } void determinateNetWorkstateInternal(int connectionsCount){ 如果(连接计数>0){ remoteServerReachable=IsUrlReachable(\u remoteServerUrl,\u remoteServerExpectedText); internetReachable=remoteServerReachable?真: IsUrlReachable(InternetUrl,_internetReachableExpectedText); } else remoteServerReachable=internetReachable=false; } } }
有哪种语言更可取吗?谢谢你的示例。它工作得很好,只是我遇到了一个非常奇怪的间歇性问题。最后通过在“Finally”块中敲打它来修复它:webRequest=null;webResponse.Close();webResponse=null;