2009-07-14 9 views
1

Environnement: Win32 pour Windows Mobile en C/C++ (VS2008)Quelqu'un peut-il recommander une meilleure alternative à InternetOpenUrl (..)?

je besoin d'une méthode propre et fiable de mise à jour des coordonnées GPS (ou d'autres données) à un serveur Web en utilisant http.

Actuellement, je l'ai utilisé le morceau de code suivant:

wsprintf (threadParam.wszLocInfo, L"%s/LOGGPS/?U=%s&LAT=%.07f&LNG=%.07f&V=%s", ...); 

HANDLE hHTTPthread = CreateThread (NULL,   // No security attributes in Windows CE. 
            0,    // Initial thread stack size, in bytes (Must be 0 under Windows CE) 
            (LPTHREAD_START_ROUTINE) HTTPthread, // Thread procedure/function. 
            &threadParam, // The argument for the new thread 
            0,    // Creation flags 
            NULL);   // Returned ID value (ignored). 

// Wait for the worker thread to complete. (with timeout) 
if (WaitForSingleObject (hHTTPthread, g_progSettings.dInetTimeout) == WAIT_TIMEOUT) 
{ 
    if (g_hHttpOpen) 
     InternetCloseHandle (g_hHttpOpen); // terminate session. 

    // Wait until the worker thread exits 
    WaitForSingleObject (hHTTPthread, INFINITE); 

    CloseHandle (hHTTPthread); 
    g_txtbox.print (L"Worker thread has exited.\r\n"); 

    return 0; 
} 




/////////////////// WorkerFunction ////////////////////// 
DWORD WINAPI HTTPthread (IN LPVOID vThreadParam) 
{ 
    // Get pointer to thread parameters. 
    THREADPARAM *pThreadParam = (THREADPARAM*)vThreadParam; 

    // Initialize an application's use of the Win32 Internet functions. 
    g_hHttpOpen = InternetOpen (APP_CLASSNAME,    // Application ID 
           INTERNET_OPEN_TYPE_DIRECT, // No proxy server access 
           NULL,      // No name for proxy server 
           NULL,      // No bypass addresses 
           0);       // No flags - Typical 
    if (g_hHttpOpen == NULL) 
     return 1; // failure 


    // Set timeout. Whether they work or not, every bit might help. 
    InternetSetOption (g_hHttpOpen, INTERNET_OPTION_CONNECT_TIMEOUT,   &g_progSettings.dInetTimeout, sizeof(DWORD)); 
    InternetSetOption (g_hHttpOpen, INTERNET_OPTION_RECEIVE_TIMEOUT,   &g_progSettings.dInetTimeout, sizeof(DWORD)); 
    InternetSetOption (g_hHttpOpen, INTERNET_OPTION_SEND_TIMEOUT,   &g_progSettings.dInetTimeout, sizeof(DWORD)); 
    InternetSetOption (g_hHttpOpen, INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT, &g_progSettings.dInetTimeout, sizeof(DWORD)); 
    InternetSetOption (g_hHttpOpen, INTERNET_OPTION_CONTROL_SEND_TIMEOUT, &g_progSettings.dInetTimeout, sizeof(DWORD)); 
    InternetSetOption (g_hHttpOpen, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &g_progSettings.dInetTimeout, sizeof(DWORD)); 
    InternetSetOption (g_hHttpOpen, INTERNET_OPTION_DATA_SEND_TIMEOUT,  &g_progSettings.dInetTimeout, sizeof(DWORD)); 


    g_hHttpUrl = InternetOpenUrl (g_hHttpOpen, 
            pThreadParam->wszLocInfo, 
            NULL, 
            0, 
            INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_NO_CACHE_WRITE, 
            0); 
    if (g_hHttpUrl == NULL) 
    { 
     InternetCloseHandle (g_hHttpOpen); 
     return 2; // failure 
    } 

    // clean-up. 
    InternetCloseHandle (g_hHttpOpen); 
    InternetCloseHandle (g_hHttpUrl); 

    return 0; // success 
} 

Maintenant, alors que cela fonctionne (la plupart du temps), nous savons tous que les délais d'attente sont squameuse et cette technique de la force brute n'est pas très fiable et réactif en tout temps.

La fonction InternetOpenUrl (..) facilite les choses, mais elle est à moitié cuite et pas très flexible. Donc, je suis à la recherche d'une alternative pour effectuer la même chose. Avec des délais d'attente fiables.

Comment gérez-vous ces mises à jour sur les serveurs Web?

Merci.

Répondre

0

Peut ne pas être une réponse utile, mais j'utilise WTL pour mon application mobile et il encapsule l'accès au service Web plutôt bien dans un CAtlHttpClientT. Je n'ai pas joué avec les changements de délai sur les requêtes SOAP, cependant.

+0

Avez-vous testé si les délais d'attente fonctionnent même? Je serais curieux. –

+0

N'a pas testé, mais il utilise un socket brut, donc s'il ne se comporte pas correctement, il s'agira d'un problème Windows sous-jacent. – Phil