C# 在Windows Mobile中管理网络状态的最佳方法

C# 在Windows Mobile中管理网络状态的最佳方法,c#,windows-mobile,compact-framework,C#,Windows Mobile,Compact Framework,我有一个.NET Compact Framework 3.5程序,用作“偶尔连接的”业务线(LOB)应用程序。如果它可以看到一个在线Web服务,它将使用它来访问数据,但如果网络连接丢失,它将使用本地缓存 处理所有连接选项和状态更改的最佳方法是什么 OpenNetCF的ConnectionManager类 Microsoft.WindowsBile.State.SystemState API调用 您如何让it部门了解WiFi、摇篮和GPRS之间的区别,并使用可用的最佳方法 有人对此有任何指导吗

我有一个.NET Compact Framework 3.5程序,用作“偶尔连接的”业务线(LOB)应用程序。如果它可以看到一个在线Web服务,它将使用它来访问数据,但如果网络连接丢失,它将使用本地缓存

处理所有连接选项和状态更改的最佳方法是什么

  • OpenNetCF的ConnectionManager类
  • Microsoft.WindowsBile.State.SystemState
  • API调用
您如何让it部门了解WiFi、摇篮和GPRS之间的区别,并使用可用的最佳方法

有人对此有任何指导吗?

在Microsoft.WindowsMobile.Status命名空间中使用该类如何?您可以监视系统的当前状态,并在状态更改时获取通知。请参阅下面的代码


SystemState只是关于连接的状态。您可以通过ConnectionManager使用特定的连接。我建议你读这本书。如果您使用的是.NET Compact Framework 3.5,则会包含一个托管API。您也可以使用OpenNetCF ConnectionManager。

我只是创建了一个简单的共享类,我可以这样调用它:

If MyConnectionClass.IsConnected then
     'Do connected stuff
Else
     'Do local save
End If
Public ReadOnly Property IsConnected As Boolean
   Get
    Try

        Dim HostName As String = Dns.GetHostName()
        Dim thisHost As IPHostEntry = Dns.GetHostByName(HostName)
        Dim thisIpAddr As String = thisHost.AddressList(0).ToString

        return (thisIpAddr <> Net.IPAddress.Parse("127.0.0.1").ToString())

    Catch ex As Exception
        Return False
    End Try
   End Get
End Property
然后,我所有的实际业务类/函数都可以使用它来隐藏UI代码中的这些污点

MyConnectionClass的IsConnected属性将具有如下内容:

If MyConnectionClass.IsConnected then
     'Do connected stuff
Else
     'Do local save
End If
Public ReadOnly Property IsConnected As Boolean
   Get
    Try

        Dim HostName As String = Dns.GetHostName()
        Dim thisHost As IPHostEntry = Dns.GetHostByName(HostName)
        Dim thisIpAddr As String = thisHost.AddressList(0).ToString

        return (thisIpAddr <> Net.IPAddress.Parse("127.0.0.1").ToString())

    Catch ex As Exception
        Return False
    End Try
   End Get
End Property
要使用它,请执行以下操作:

public void DoTcpConnection()
    {
        string url = "www.msn.com";
        bool res = GPRSConnection.Setup("http://" + url + "/");
        if (res)
        {
            TcpClient tc = new TcpClient(url, 80);
            NetworkStream ns = tc.GetStream();
            byte[] buf = new byte[100];
            ns.Write(buf, 0, 100);
            tc.Client.Shutdown(SocketShutdown.Both);
            ns.Close();
            tc.Close();
            MessageBox.Show("Wrote 100 bytes");
        }
        else
        {
            MessageBox.Show("Connection establishment failed");
        }
    }
这是Anthony Wong的博客:


请记住,您只需要在较低级别的TCP或UDP内容中使用它。HTTPRequests不需要这个。

我尝试编写移动应用程序,这样他们甚至不知道涉及到网络。我在本地保存足够好的验证数据,然后将事务写入本地队列,该队列在连接时清除;队列读取器包括一个计时器,用于在未连接时重试。队列消息是双向的,因此也可以提供本地刷新。基本消息队列模式


这使我能够以最简单的方式处理网络连接,使用基本的套接字打开/关闭/读/写/ioctl逻辑,这种逻辑具有高度的可移植性;而且你的关系根本不需要持续很长时间。(我不想想象过去几年中,为了与所有MS体系结构变化保持同步,需要做些什么——这一点我还没有解决。)

我发现Microsoft.WindowsMobile.State.SystemState报告网络连接是不可靠的。这是6.0和更早的版本。我没有进行详尽的测试,但当有连接时,它会说没有连接时,它被放弃了。

我如何使用SystemState来告诉它尝试连接(即,如果可用,启动GPRS)?我如何告诉它尝试连接(即,如果可用,启动GPRS)?发布的方法(和链接)似乎只是一个地址,似乎是连接打开或关闭的WiFi。我非常同意你所写的,我有一个移动应用程序,当WiFi不存在时,将切换到使用短信作为协议。这很容易做到,因为我在CLSA for CE中内置了一个基于“消息队列”的xfer系统。我希望我能继续使用它,但那个项目放弃了电话选项=(