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服务器?
谢谢。
您是否测试过超时甚至是否工作?我很好奇。 – 2009-07-14 23:52:41
没有测试,但它使用原始套接字,所以如果它不检点这将是一个潜在的Windows问题。 – Phil 2009-07-16 12:11:30