Пробовал я разобраться в этой библиотеке... Ну можно сказать, что кое-что я понял. Написал программу, которая скачивает сайты, начиная с какой-то стартовой ссылки. И вот проблема: на работе все ОК, а дома по диалапу никакого эффекта. В ответ только — файл не найден. Может кто может объяснить, почему так происходит?
ЗЫ На работе естесственно есть прокси.
Здравствуйте, _Ramzes_, Вы писали:
_R_>Пробовал я разобраться в этой библиотеке... Ну можно сказать, что кое-что я понял. Написал программу, которая скачивает сайты, начиная с какой-то стартовой ссылки. И вот проблема: на работе все ОК, а дома по диалапу никакого эффекта. В ответ только — файл не найден. Может кто может объяснить, почему так происходит?
Здравствуйте, Alex Fedotov, Вы писали:
AF>Здравствуйте, _Ramzes_, Вы писали:
_R_>>Пробовал я разобраться в этой библиотеке... Ну можно сказать, что кое-что я понял. Написал программу, которая скачивает сайты, начиная с какой-то стартовой ссылки. И вот проблема: на работе все ОК, а дома по диалапу никакого эффекта. В ответ только — файл не найден. Может кто может объяснить, почему так происходит?
AF>Конечно можем: в Вашей программе ошибка.
Спасибо за ценное замечание. На самом деле я прекрасно понимаю, что где-то напортачил.
Собственно вопрос заключался вот в чем: есть ли разница при использовании функций WinInet в случае постоянного подключения и диалапного?
Здравствуйте, _Ramzes_, Вы писали:
_R_>Собственно вопрос заключался вот в чем: есть ли разница при использовании функций WinInet в случае постоянного подключения и диалапного?
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, _Ramzes_, Вы писали:
_R_>>Собственно вопрос заключался вот в чем: есть ли разница при использовании функций WinInet в случае постоянного подключения и диалапного?
DM>Таймауты?
А с этого места можно поподробнее? Куда их вставить? И какие?
Здравствуйте, _Ramzes_, Вы писали:
_R_>>>Собственно вопрос заключался вот в чем: есть ли разница при использовании функций WinInet в случае постоянного подключения и диалапного? DM>>Таймауты? _R_>А с этого места можно поподробнее? Куда их вставить? И какие?
HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\Internet Settings.
Параметр ReceiveTimeout (DWORD) — время ожидания в милисекундах.
Можно поиграться вокруг — может поможет.
К тому же можно для диалапа использовать для соединения вместо InternetConnect() функцию InternetDial() — также может помочь.
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, _Ramzes_, Вы писали:
_R_>>>>Собственно вопрос заключался вот в чем: есть ли разница при использовании функций WinInet в случае постоянного подключения и диалапного? DM>>>Таймауты? _R_>>А с этого места можно поподробнее? Куда их вставить? И какие?
DM>HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\Internet Settings. DM>Параметр ReceiveTimeout (DWORD) — время ожидания в милисекундах. DM>Можно поиграться вокруг — может поможет. DM>К тому же можно для диалапа использовать для соединения вместо InternetConnect() функцию InternetDial() — также может помочь.
Просто мимо проходил и стало интересно
А что таймауты в виненете тока через реестр настраиваются ??? Если так то енто ж полный отстой Как я тогда разумно однако сделал в своё время своего клиентого через сокеты написав...
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, _Ramzes_, Вы писали:
_R_>>>>Собственно вопрос заключался вот в чем: есть ли разница при использовании функций WinInet в случае постоянного подключения и диалапного? DM>>>Таймауты? _R_>>А с этого места можно поподробнее? Куда их вставить? И какие?
DM>HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\Internet Settings. DM>Параметр ReceiveTimeout (DWORD) — время ожидания в милисекундах. DM>Можно поиграться вокруг — может поможет. DM>К тому же можно для диалапа использовать для соединения вместо InternetConnect() функцию InternetDial() — также может помочь.
Как выяснилось дело было в другом. Всего то надо было указать в функции InternetConnect флаг INTERNET_FLAG_EXISTING_CONNECT и все стало нормально.
А что касается InternetDial, то тогда придется определять какой тип подключения у юзера, а это лишний код.
Здравствуйте, Аноним, Вы писали:
А>Просто мимо проходил и стало интересно
А>А что таймауты в виненете тока через реестр настраиваются ??? Если так то енто ж полный отстой Как я тогда разумно однако сделал в своё время своего клиентого через сокеты написав...
На самом деле таймауты прекрасно настраиваются и программно без реестра.
А сокеты и WinInet — разные вещи и их использование зависит от того, какую программу писать. WinInet дает достаточно возможностей для написания клиента без лишних заморочек.
Здравствуйте, _Ramzes_, Вы писали:
DM>>К тому же можно для диалапа использовать для соединения вместо InternetConnect() функцию InternetDial() — также может помочь.
_R_>Как выяснилось дело было в другом. Всего то надо было указать в функции InternetConnect флаг INTERNET_FLAG_EXISTING_CONNECT и все стало нормально.
Хм. Выдержка из MSDN:
INTERNET_FLAG_EXISTING_CONNECT
Attempts to use an existing InternetConnect object if one exists with the same attributes required to make the request. This is useful only with FTP operations, since FTP is the only protocol that typically performs multiple operations during the same session. The Win32 Internet API caches a single connection handle for each HINTERNET handle generated by InternetOpen. Only the InternetOpenUrl function uses this flag.
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, _Ramzes_, Вы писали:
DM>>>К тому же можно для диалапа использовать для соединения вместо InternetConnect() функцию InternetDial() — также может помочь.
_R_>>Как выяснилось дело было в другом. Всего то надо было указать в функции InternetConnect флаг INTERNET_FLAG_EXISTING_CONNECT и все стало нормально.
DM>Хм. Выдержка из MSDN:
DM>INTERNET_FLAG_EXISTING_CONNECT
DM>Attempts to use an existing InternetConnect object if one exists with the same attributes required to make the request. This is useful only with FTP operations, since FTP is the only protocol that typically performs multiple operations during the same session. The Win32 Internet API caches a single connection handle for each HINTERNET handle generated by InternetOpen. Only the InternetOpenUrl function uses this flag.
DM>Как насчет выделенного?
This is useful only with FTP operations — это полезно для FTP, но кто сказал, что нельзя использовать этот флаг для других целей? Only the InternetOpenUrl function uses this flag — ну насчет этого могу сказать, что в том же MSDN'е хэндлы, полученные с помощью InternetOpenUrl и InternetOpenRequest используются без всяких ограничений во всех функциях. Отсюда я сделал вывод, что и при создании этих хэндлов можно использовать одинаковые флаги.
И вообще, у меня уже была возможность убедиться, что в MSDN'е есть неточности.
Сейчас у меня появился новый вопрос, а как же можно узнать размер файла по ссылке и есть ли он вообще? А то разные хосты реагируют на мои запросы по-разному?
Здравствуйте, _Ramzes_, Вы писали:
_R_>PS именно MSDN меня и смутил, когда я это писал.
_R_>Сейчас у меня появился новый вопрос, а как же можно узнать размер файла по ссылке и есть ли он вообще? А то разные хосты реагируют на мои запросы по-разному?
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, _Ramzes_, Вы писали:
_R_>>PS именно MSDN меня и смутил, когда я это писал.
_R_>>Сейчас у меня появился новый вопрос, а как же можно узнать размер файла по ссылке и есть ли он вообще? А то разные хосты реагируют на мои запросы по-разному?
DM>Посмотри ветки: здесь
По первой ссылке могу сказать, что этот способ не пройдет. Допустим я хочу узнать есть ли файл http://yar.lancktelecom.ru/talk/forum.php3, тогда я получу -1, хотя файл существует и его можно запросто скачать. Так что тут нужен какой-то другой подход.
Проблема еще в том, что некоторые серверы говорят, что файла нет и предлагают поискать в другом месте, а некоторые говорят, что все ОК и подсовывают страничку с 404.
А еще более серьезная проблема заключается в том, что по запросу по протоколу HTTP\1.0 сервер не обязан возвращать размер файла. Так что определение наличия файла по его размеру не проходит.
По второй ссылке аналогично.
Так что я в .
Здравствуйте, _Ramzes_, Вы писали:
_R_>Моя работа продвигается дальше... И вот возник вопрос про докачку файлов, точнее как определить поддерживает ли сервер докачку?
по-моему, в HTTP есть команда "GETRANGE x-x", по тому как сервак ответит на нее, ты узнаешь, поддерживает ли он докачку, заодно в ответе может содержаться и размер файла;
из моего опыта (давно было, может ошибаюсь), если сервак не подддерживает докачку, он отвечает как на обычный GET, иначе возвращает запрошенный диапазон и общий размер;
можно, например, в GETRANGE указывать 0-0, так делают некоторые менеджеры по закачке
вообще хорошо бы поставить снифер и смотреть как в аналогичной ситуации поступают те или иные проги для закачек (FlashGet, DownloadAccelerator, Reget и т.д.)
Здравствуйте, heavyweapondude, Вы писали:
H>Здравствуйте, _Ramzes_, Вы писали:
_R_>>Моя работа продвигается дальше... И вот возник вопрос про докачку файлов, точнее как определить поддерживает ли сервер докачку?
H>по-моему, в HTTP есть команда "GETRANGE x-x", по тому как сервак ответит на нее, ты узнаешь, поддерживает ли он докачку, заодно в ответе может содержаться и размер файла; H>из моего опыта (давно было, может ошибаюсь), если сервак не подддерживает докачку, он отвечает как на обычный GET, иначе возвращает запрошенный диапазон и общий размер; H>можно, например, в GETRANGE указывать 0-0, так делают некоторые менеджеры по закачке H>вообще хорошо бы поставить снифер и смотреть как в аналогичной ситуации поступают те или иные проги для закачек (FlashGet, DownloadAccelerator, Reget и т.д.)
Здравствуйте, _Ramzes_, Вы писали:
_R_>А что значит команда GETRANGE x-x?
Точнее это называется "partial GET request"
Посмотри команды HTTP, ты можешь их использовать в HttpSendRequest в параметре lpszHeaders
что-то типа HttpSendRequest(hReq, "Range: bytes=%d-%d", len, NULL, 0)
ищи примеры в google
INTERNET_OPEN_TYPE_PRECONFIG Есть прокси или нету WinInet будет сам раздуплялтся правда если есть то в InternetConnect надо будет указать пароль и логин на прокси
Здравствуйте, Chlavik, Вы писали:
C>hSession:=InternetOpen('Test',INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); C>???
C>INTERNET_OPEN_TYPE_PRECONFIG Есть прокси или нету WinInet будет сам раздуплялтся правда если есть то в InternetConnect надо будет указать пароль и логин на прокси