Может кто-нибудь порекомендовать лучшую альтернативу InternetOpenUrl (..)? - PullRequest
1 голос
/ 15 июля 2009

Среда: Win32 для Windows Mobile с использованием C / C ++ (VS2008)

Мне нужен чистый и надежный метод обновления некоторых GPS-координат (или других данных) на веб-сервере с использованием http.

В настоящее время я использую следующий фрагмент кода:

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
}

Теперь, хотя это работает (в основном), мы все знаем, что таймауты являются ненадежными, и эта техника грубой силы не всегда надежна и отзывчива.

Функция InternetOpenUrl (..) упрощает работу, но она недоработана и не очень гибка.

Так что я ищу альтернативу, чтобы выполнить то же самое. С надежными таймаутами .

Как вы, ребята, обращаетесь с такими обновлениями веб-серверов?

Спасибо.

1 Ответ

0 голосов
/ 15 июля 2009

Может быть не очень полезным ответом, но я использую WTL для своего мобильного приложения, и он довольно удобно оборачивает доступ к веб-сервису в CAtlHttpClientT. Тем не менее, я не играл с изменением времени ожидания для запросов SOAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...