Environnement: Win32 pour Windows Mobile en C/C++ (VS2008)Quelqu'un peut-il recommander une meilleure alternative à InternetOpenUrl (..)?
je besoin d'une méthode propre et fiable de mise à jour des coordonnées GPS (ou d'autres données) à un serveur Web en utilisant http.
Actuellement, je l'ai utilisé le morceau de code suivant:
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
}
Maintenant, alors que cela fonctionne (la plupart du temps), nous savons tous que les délais d'attente sont squameuse et cette technique de la force brute n'est pas très fiable et réactif en tout temps.
La fonction InternetOpenUrl (..) facilite les choses, mais elle est à moitié cuite et pas très flexible. Donc, je suis à la recherche d'une alternative pour effectuer la même chose. Avec des délais d'attente fiables.
Comment gérez-vous ces mises à jour sur les serveurs Web?
Merci.
Avez-vous testé si les délais d'attente fonctionnent même? Je serais curieux. –
N'a pas testé, mais il utilise un socket brut, donc s'il ne se comporte pas correctement, il s'agira d'un problème Windows sous-jacent. – Phil