// инициализируем интернет-соединения
if((hInternet = InternetOpen(szAgent, INTERNET_OPEN_TYPE_PROXY,
"https=https://192.168.0.1:8080", NULL, NULL)) != NULL)
{
dwID = GetID();
wsprintf(szImage, "https://somehost.tld/img.php?%d", dwID);
// открываем картинку
if((hImage = InternetOpenUrl(hInternet, szImage,
NULL, NULL, NULL, NULL)) != NULL)
{
if(InternetReadFile(hImage, szBuffer, sizeof(szBuffer), &dwRead))
{
// скачали
fp = fopen("c:\\tmp.jpg", "w");
fwrite(szBuffer, dwRead, 1, fp);
fclose(fp);
}
else Debug("Can not download image..", 1);
// закрываем сессию
InternetCloseHandle(hImage);
}
// закрываем интернет-соединения
InternetCloseHandle(hInternet);
}
WinInet
https://somehost.tld/img.php?123456, где 123456 - генерируемое по определённому алгоритму число. Поскольку разбираться в RFC по SSL не было ни малейшего желания, было решено использовать библиотеку WinInet. Однако не обошлось без неприятностей.
Дело в том, что этот код вроде бы работает, т.е. картинка скачивается и записывается на диск, но если открыть её в ACDSee, то оторажается полнейший мусор. Кто-нибудь сталкивался с похожей проблемой?
Задача: скачать из интернета картинку по адресу
Код:
Дело в том, что этот код вроде бы работает, т.е. картинка скачивается и записывается на диск, но если открыть её в ACDSee, то оторажается полнейший мусор. Кто-нибудь сталкивался с похожей проблемой?
Цитата:
Originally posted by PASS
Задача: скачать из интернета картинку по адресу https://somehost.tld/img.php?123456, где 123456 - генерируемое по определённому алгоритму число. Поскольку разбираться в RFC по SSL не было ни малейшего желания, было решено использовать библиотеку WinInet. Однако не обошлось без неприятностей.
Дело в том, что этот код вроде бы работает, т.е. картинка скачивается и записывается на диск, но если открыть её в ACDSee, то оторажается полнейший мусор. Кто-нибудь сталкивался с похожей проблемой?
Задача: скачать из интернета картинку по адресу https://somehost.tld/img.php?123456, где 123456 - генерируемое по определённому алгоритму число. Поскольку разбираться в RFC по SSL не было ни малейшего желания, было решено использовать библиотеку WinInet. Однако не обошлось без неприятностей.
Код:
// инициализируем интернет-соединения
if((hInternet = InternetOpen(szAgent, INTERNET_OPEN_TYPE_PROXY,
"https=https://192.168.0.1:8080", NULL, NULL)) != NULL)
{
dwID = GetID();
wsprintf(szImage, "https://somehost.tld/img.php?%d", dwID);
// открываем картинку
if((hImage = InternetOpenUrl(hInternet, szImage,
NULL, NULL, NULL, NULL)) != NULL)
{
if(InternetReadFile(hImage, szBuffer, sizeof(szBuffer), &dwRead))
{
// скачали
fp = fopen("c:\\tmp.jpg", "w");
fwrite(szBuffer, dwRead, 1, fp);
fclose(fp);
}
else Debug("Can not download image..", 1);
// закрываем сессию
InternetCloseHandle(hImage);
}
// закрываем интернет-соединения
InternetCloseHandle(hInternet);
}
if((hInternet = InternetOpen(szAgent, INTERNET_OPEN_TYPE_PROXY,
"https=https://192.168.0.1:8080", NULL, NULL)) != NULL)
{
dwID = GetID();
wsprintf(szImage, "https://somehost.tld/img.php?%d", dwID);
// открываем картинку
if((hImage = InternetOpenUrl(hInternet, szImage,
NULL, NULL, NULL, NULL)) != NULL)
{
if(InternetReadFile(hImage, szBuffer, sizeof(szBuffer), &dwRead))
{
// скачали
fp = fopen("c:\\tmp.jpg", "w");
fwrite(szBuffer, dwRead, 1, fp);
fclose(fp);
}
else Debug("Can not download image..", 1);
// закрываем сессию
InternetCloseHandle(hImage);
}
// закрываем интернет-соединения
InternetCloseHandle(hInternet);
}
Дело в том, что этот код вроде бы работает, т.е. картинка скачивается и записывается на диск, но если открыть её в ACDSee, то оторажается полнейший мусор. Кто-нибудь сталкивался с похожей проблемой?
И где блок дешифрации скаченого файла?
видимо беда в том, что получаемые данные закриптованы (раз уж это идёт через SSL).У меня похожая беда. Как я понял нужно ищё юзать InternetSetOption с параметром INTERNET_OPTION_CLIENT_CERT_CONTEXT
Как сказано в МСДН:
INTERNET_OPTION_CLIENT_CERT_CONTEXT
84
This flag is not supported by InternetQueryOption. The lpBuffer parameter must be a pointer to a CERT_CONTEXT structure and not a pointer to a CERT_CONTEXT pointer. If an application receives ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED, it must call InternetErrorDlg or use InternetSetOption to supply a certificate before retrying the request. CertDuplicateCertificateContext is then called so that the certificate context passed can be independently released by the application.
хотя может я неправ (сам пытаюсь разобратся:))
fp = fopen("c:\\tmp.jpg", "wb");