Аннотация:
Ещё вчера Вы даже и не думали о написании программ, использующих интернет протоколы, полагая, что это удел web-программистов. Но, уже сегодня перед Вами стоит задача прочитать/записать, передать/принять, получить/послать что-либо из своей программы на какой-либо интернет-сервер. Какие средства для этого существуют Сколько времени уйдёт на их изучение и эксперименты Давайте рассмотрим один из способов, который позволяет решать большинство подобных задач в максимально короткие сроки.
Если нам не помогут, то мы тоже никого не пощадим.
>1. INFO: WinInet Limits Connections Per Server (Q183110). >WinInet ограничивает число соединений для одного сервера, которое может быть равно двум или четырём. >Такое ограничение связано с соглашениями HTTP спецификации и стандарта.
Это ограничение задается ключем в реестре.
И в Windows 2000 значение по умолчанию — 100.
if (fnews.is_open()) for (;) {
// читаем данные
char szData[1024];
DWORD dwBytesRead;
BOOL bRead =
::InternetReadFile(
hRequest,
szData,sizeof(szData)-1,
&dwBytesRead);
// выход из цикла при ошибке или завершении
if (bRead == FALSE || dwBytesRead == 0)
break;
// сохраняем результат
szData[dwBytesRead] = 0;
Тут что, надежды, прочитать больше килобайта, нет? Если файл размером больше или читается не за один заход, то получим только его хвост.
Вот почитал статью про вининет... полезно, но вининет не во всяких виндах есть и не со всяким эксплорером идет, а мне надо чтобы везде работало. Даже винсока второго в старой 95 не было. Приходится довольствоваться первым, но всплыла проблема определения прокси-сервера на системах где стоит галка "автоопределение" :(
И что-то никак у меня не получается добиться прокси от вининета. Т.е. заставить его коннектиться с текущими настройками я могу, но переделывать программу, уже работающую... делить ее на две ветки одну для винсока, другую для вининета не очень то хочется, а где забрать настройки прокси я так и не понял :(
Ничего он не даёт, только геморой. Для FTP может что-то и даёт, для HTTP я не нашёл ни одного толкового примера, что подтвердило мою версию о том, что HTTP и асинхронный режим не дружат.
Поэтому я в статью это даже и не включал. Лучше использовать многозадаяность. Если я не прав с радостью выслушаю любую информацию по этому поводу, а лучше хороший пример.
Это очень плохо.
У меня всё работает и через прокси и без.
Если работает в браузере, то должно работать и через WinInet, если нет, то у тебя неправильный WinInet ;)
Попробуй ещё поставить rd.SetDataBuffer(20*1024); перед чтением, может быть нулевая длинна возвращается не только из-за неправильной работы сервера, но и клиента.
Спасибо! А чего там чекать, WinInet как WinInet :o)
А вообще-то, каждый архив проекта в каталоге Release содержит собранную программу, проверенную доступными антивирусными средствами и готовую к исполнению. Запуск примеров много времени не займёт.
Happy coding,
Игорь.
calc.cpp(23) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class _bstr_t' (or there is no acceptable conversion)
горе мне горе, и WinInet у меня не правильный и VC (№6+SP5+STLPort) :-(
С (LPCTSTR) конечно все прошло, но вот где берут cout, которые и без этого работают?
Ладно, ближе к телу. Дело видимо все-таки в том что выход через мой прокси по паролю. Поскольку calc его нигде не спрашивает, то в
char *data = rd.GetData();
я получаю страничку с Cache Access Denied и т.д. и т.п
так там же все вроде правильно —
m_hInternet = ::InternetOpen(
lpszAgent,
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
т.е. взять все настройки из реестра (т.е. надо думать из настроек IE), прокси там прописан, а пароль IE потом переспрашивает.
Ну вот, из коммандировки вернулся, можно продолжить :-)
Итак, куда подставить-то?
HINTERNET InternetOpen(
IN LPCSTR lpszAgent,
IN DWORD dwAccessType,
IN LPCSTR lpszProxyName,
IN LPCSTR lpszProxyBypass,
IN DWORD dwFlags
);
...
lpszProxyName
Address of a string that contains the name of the proxy server (or servers) to use if proxy access was specified. If this parameter is NULL, the function reads proxy information from the registry...
lpszProxyBypass
Address of an optional list of host names or IP addresses, or both, that should not be routed through the proxy.
... If this parameter is NULL, the function reads the bypass list from the registry.
Имеем имя прокси и список хостов, на которые надо ходить мимо прокси.
Это я в попыхах видимо отвечал, сам не очень разобрался что к чему, сори.
Ищи в MSDN статью "HOWTO: How to Handle Proxy Authorization with WinInet"
Я у себя проверить это дело не могу, если у тебя будет всё ok, давай подработаем класс и вставим это дело в статью. Там как-то можно определить требуется авторизация или нет.
Объясните пожалуйсто кто-нибудь назначение последнего параметра
функции internetconnect, и смысл значения 1u. В msdn возможные значения не
описаны, а смысл вложенный в описание понять не могу.
dwContext
[in] Pointer to a variable that contains an application-defined value that is used to identify the application context for the returned handle in callbacks.