環境: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サーバにそのような更新を処理していますか?
ありがとうございました。
タイムアウトでも働けば、あなたがテストしたことがありますか?私は好奇心が強いだろう。 –
テストされていませんが、未処理のソケットを使用していますので、正常に動作しない場合はWindowsの基本問題となります。 – Phil