2009-07-14 115 views
1

环境:为的Win32/C++(VS2008)有人可以推荐一个更好的替代InternetOpenUrl(..)?

Windows Mobile的用C我需要一个清洁的和可靠更新一些GPS坐标(或其他数据),以使用HTTP web服务器的方法。

目前我一直在使用下面的代码:

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中(..)功能,使事情变得简单,但它是半生不熟的,而不是很灵活。

所以我正在寻找替代方案来执行相同的事情。 凭借可靠的超时时间

你是如何处理的家伙这样的更新到Web服务器?

谢谢。

回答

0

可能不是一个有用的答案,但我使用WTL我的移动应用程序,它是在一个CAtlHttpClientT很好地包裹起来的Web服务访问。尽管如此,还没有改变SOAP请求的超时时间。

+0

您是否测试过超时甚至是否工作?我很好奇。 – 2009-07-14 23:52:41

+0

没有测试,但它使用原始套接字,所以如果它不检点这将是一个潜在的Windows问题。 – Phil 2009-07-16 12:11:30

相关问题