2009-07-14 6 views
1

環境:Windows Mobile用のWin32は、C/C++(VS2008)を使用して誰かがInternetOpenUrl(..)のより良い代替手段を推奨できますか?

私はきれいで、HTTPを使用してWebサーバーにいくつかのGPS座標(または他のデータ)を更新する信頼できる方法を必要としています。

現在、私は次のコード使用してきました:これは(主に)働きながら、我々はすべてのタイムアウトがフレーク状であり、この強引な手法は、非常に信頼性がないことを知っている今、

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

タイムアウトでも働けば、あなたがテストしたことがありますか?私は好奇心が強いだろう。 –

+0

テストされていませんが、未処理のソケットを使用していますので、正常に動作しない場合はWindowsの基本問題となります。 – Phil

関連する問題