Лучший способ управлять состоянием сети в Windows Mobile

Перейдите в местоположение проекта и откройте терминал в этом месте и выполните следующую команду Сначала ./gradlew clean Затем ./gradlew assemblyDebug

N.B. Убедитесь, что вы подключены к Интернету

6
задан JasonRShaver 3 April 2009 в 21:19
поделиться

4 ответа

Я просто создаю простой общий класс, который я могу назвать как это:

If MyConnectionClass.IsConnected then
     'Do connected stuff
Else
     'Do local save
End If

Затем все мои фактические бизнес-классы/функции могут использовать это для сокрытия этой злобности от кода UI.

Свойство MyConnectionClass' IsConnected имело бы что-то вроде этого:

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

Также рекомендуется, чтобы Вы опросили относительно состояния соединения с помощью фонового потока и затем запустили событие назад в поток главного приложения когда изменения состояния. Вот подробная рецензия:

Тестирование на и ответ на сетевые соединения в.NET Компактная Платформа

Править:

Теперь, для поддержки GPRS:

При использовании Веб-запросов или веб-сервисов платформа обработает соединение для Вас. Если Вы погружаетесь глубже в TCPClient или UDPClient, необходимо обработать его с Менеджером соединений API сами как так:

public class GPRSConnection
{
    const int S_OK = 0;
    const uint CONNMGR_PARAM_GUIDDESTNET = 0x1;
    const uint CONNMGR_FLAG_PROXY_HTTP = 0x1;
    const uint CONNMGR_PRIORITY_USERINTERACTIVE = 0x08000;
    const uint INFINITE = 0xffffffff;
    const uint CONNMGR_STATUS_CONNECTED = 0x10;
    static Hashtable ht = new Hashtable();

    static GPRSConnection()
    {
        ManualResetEvent mre = new ManualResetEvent(false);
        mre.Handle = ConnMgrApiReadyEvent();
        mre.WaitOne();
        CloseHandle(mre.Handle);
    }

    ~GPRSConnection()
    {
        ReleaseAll();
    }

    public static bool Setup(Uri url)
    {
        return Setup(url.ToString());
    }

    public static bool Setup(string urlStr)
    {
        ConnectionInfo ci = new ConnectionInfo();
        IntPtr phConnection = IntPtr.Zero;
        uint status = 0;

        if (ht[urlStr] != null)
            return true;

        if (ConnMgrMapURL(urlStr, ref ci.guidDestNet, IntPtr.Zero) != S_OK)
            return false;

        ci.cbSize = (uint) Marshal.SizeOf(ci);
        ci.dwParams = CONNMGR_PARAM_GUIDDESTNET;
        ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
        ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
        ci.bExclusive = 0;
        ci.bDisabled = 0;
        ci.hWnd = IntPtr.Zero;
        ci.uMsg = 0;
        ci.lParam = 0;

        if (ConnMgrEstablishConnectionSync(ref ci, ref phConnection, INFINITE, ref status) != S_OK &&
            status != CONNMGR_STATUS_CONNECTED)
            return false;

        ht[urlStr] = phConnection;
        return true;
    }

    public static bool Release(Uri url)
    {
        return Release(url.ToString());
    }

    public static bool Release(string urlStr)
    {
        return Release(urlStr, true);
    }

    private static bool Release(string urlStr, bool removeNode)
    {
        bool res = true;
        IntPtr ph = IntPtr.Zero;
        if (ht[urlStr] == null)
            return true;
        ph = (IntPtr)ht[urlStr];
        if (ConnMgrReleaseConnection(ph, 1) != S_OK)
            res = false;
        CloseHandle(ph);
        if (removeNode)
            ht.Remove(urlStr);
        return res;
    }

    public static void ReleaseAll()
    {
       foreach(DictionaryEntry de in ht)
       {
           Release((string)de.Key, false);
       }
       ht.Clear();
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct ConnectionInfo
    {
        public uint cbSize;
        public uint dwParams;
        public uint dwFlags;
        public uint dwPriority;
        public int bExclusive;
        public int bDisabled;
        public Guid guidDestNet;
        public IntPtr hWnd;
        public uint uMsg;
        public uint lParam;
        public uint ulMaxCost;
        public uint ulMinRcvBw;
        public uint ulMaxConnLatency;
    }

    [DllImport("cellcore.dll")]
    private static extern int ConnMgrMapURL(string pwszURL, ref Guid pguid, IntPtr pdwIndex);

    [DllImport("cellcore.dll")]
    private static extern int ConnMgrEstablishConnectionSync(ref ConnectionInfo ci, ref IntPtr phConnection, uint dwTimeout, ref uint pdwStatus);

    [DllImport("cellcore.dll")]
    private static extern IntPtr ConnMgrApiReadyEvent();

    [DllImport("cellcore.dll")]
    private static extern int ConnMgrReleaseConnection(IntPtr hConnection, int bCache);

    [DllImport("coredll.dll")]
    private static extern int CloseHandle(IntPtr hObject);
}

И использовать его, сделайте это:

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 здесь:

Anthony Wong

И помните, что Вам только нужно это для более низкого уровня материал UDP или TCP. HTTPRequests не нужно это.

2
ответ дан 17 December 2019 в 04:52
поделиться

Что относительно того, чтобы использовать класс SystemState в Microsoft. WindowsMobile. Пространство имен состояния? Можно контролировать текущее состояние системы и получить уведомления, когда изменения состояния. См. это сообщение для некоторого кода.

SystemState только о состоянии соединений. Можно использовать определенное соединение через ConnectionManager. Я рекомендую читать эту статью. При использовании.NET Компактная Платформа 3.5 управляемый API включен. Можно также использовать OpenNetCF ConnectionManager.

1
ответ дан 17 December 2019 в 04:52
поделиться

Я пытаюсь записать Мобильные приложения, таким образом, они даже не знают, что существует включенная сеть. Я сохраняю достаточно хорошие данные проверки локально и затем транзакции записи локальной очереди, которая очищается, в то время как соединено; читатель очереди включает таймер для повторения при отсутствии соединения. Сообщения очереди двунаправлены, таким образом, локальные обновления могут быть предоставлены также. Основные шаблоны Очереди сообщений.

Это позволяет мне рассматривать сетевое соединение самым простым способом, с помощью основного сокета open/close/read/write/ioctl логика, это очень портативно; и Ваши соединения не должны сохраняться в течение никакого значительного времени вообще. (Я не хотел бы вообразить то, что потребуется, чтобы оставаться в синхронизации со всеми изменениями архитектуры MS за прошлые несколько лет - который все еще не обосновался, по моему скромному мнению.)

1
ответ дан 17 December 2019 в 04:52
поделиться

Я обнаружил отчет Microsoft.WindowsMobile.State.SystemState о сетевых подключениях к быть ненадежным. Это было 6.0 и ранее. Я не проводил исчерпывающего тестирования, но от него отказались, когда он сказал, что связи нет, когда она была.

1
ответ дан 17 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: