http качалка
-
если две проги разом позовут downloader, то в файле /rd/1/.download. будет бред, или результат только одного из запросов?И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Это вопрос скорее к ядерщикам. Файл записывается целиком, за 1 раз, функцией 70/2. Будет ли бред?
В идеале следовало бы передавать файл вызывающей программе через общую память...
В идеале следовало бы передавать файл вызывающей программе через общую память...
да, было бы здорово) например, прога вызывает downloader, передавая идентификатор расшаренной памяти, а downloader просто пишет в нее.. Вернее, два идентификатора, верно? Отдельно для заголовков.. // Хм, а можно еще и третий, с памятью на чтение, с текстом передаваемых заголовков..
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
При скачивании http://www.ya.ru и http://www.yandex.ru downloader, хотя и правильно всё скачивает и записывает на диск, но не завершается. (Тут нужно разбираться, может, это следствие общей кривости сетевого стека в ядре. Скажем, три FIN-пакета подряд от ядра серверу без какой-либо реакции сервера меня сильно удивляют.) Если при этом попытаться скачать http://www.wasm.ru, то downloader слетает:
При скачивании http://www.wasm.ru (отдельно от первого теста) всё внешне выглядит нормально, программа завершается добровольно, но в /rd/1/.download оказывается фигня, начиная с "tml>" вместо "<html>". На доске отладки видно следующее:
Ушёл к умным, знающим и культурным людям.
И ещё замечание. Сейчас один запрос разбивается на 4 пакета. Каждый пакет размером (в типичном случае) максимум 17 байт оборачивается в tcp/ip/ethernet-фреймы, приводя к передаче дополнительных 54 байт на каждый пакет. Всё это нагружает сеть, доходит до сервера, сервер вынужден для каждого из этих пакетов посылать оповещение, что пакет получен... в общем, куча избыточных байт гуляет по сети. Насколько сложно всё оборачивать в как можно меньшее число пакетов? В типичном случае запрос замечательно умещается в один.
Ушёл к умным, знающим и культурным людям.
Не удалось воспроизвести. У меня скачивает, записывает и завершается.При скачивании http://www.ya.ru и http://www.yandex.ru downloader, хотя и правильно всё скачивает и записывает на диск, но не завершается.
Исправил."tml>" вместо "<html>"
Запрос теперь отправляется за один раз (сделал буфер и составляю запрос в нем).
Пока не стал делать обмен через общую память, поскольку в перспективе downloader превратится в библиотеку и тогда вся память и так будет общей. Пока все работает через "/rd/1/.download".
- Attachments
-
-
downloader-0.84.7z (11.92 KiB)Downloaded 300 times
-
Ага, уже лучше. Ещё замечания:
1. Иногда страница не докачивается - вместо последнего пакета записываются нули. Иногда докачивается.
2. Программа отжирает всё доступное процессорное время на пустые проверки, не пришло ли чего.
3. При запуске из командной строки всё работает (по модулю первых двух примечаний). При запуске через GUI на wasm.ru вылетает.
1. Иногда страница не докачивается - вместо последнего пакета записываются нули. Иногда докачивается.
2. Программа отжирает всё доступное процессорное время на пустые проверки, не пришло ли чего.
3. При запуске из командной строки всё работает (по модулю первых двух примечаний). При запуске через GUI на wasm.ru вылетает.
Ушёл к умным, знающим и культурным людям.
Тема заглохла или только кажется?
В соседних темах просили поддержку прокси "с логином и паролем которые", я добавила в последнюю версию с исходниками работу через прокси, прошу потестировать и оценить.
Вроде сказано, что "в перспективе downloader превратится в библиотеку" - над этим идёт работа или нет? Я старалась изменять как можно меньше, чтобы меньше проблем могло возникнуть при портировании изменений, если есть куда. Вообще здесь есть что менять, поэтому нельзя ли выложить самую текущую версию, если такая есть, чтобы я могла развивать, не теряя уже проделанных другими изменений?
Настройки прокси мой вариант считывает из файла конфигурации, я выбрала /sys/network/zeroconf.ini, потому что в этом файле уже хранятся некоторые настройки сети и, кажется, есть смысл хранить другие настройки сети в том же месте. Может быть, стоит переименовать его в network.ini?
Пример файла с настройками:
Новые параметры я считываю из секции proxy. Параметр proxy задаёт адрес прокси и может быть ip-адресом или доменным именем, port - порт прокси. Для прокси с авторизацией есть два параметра user и password, если их нет, то программа считает, что авторизация не нужна.
В соседних темах просили поддержку прокси "с логином и паролем которые", я добавила в последнюю версию с исходниками работу через прокси, прошу потестировать и оценить.
Вроде сказано, что "в перспективе downloader превратится в библиотеку" - над этим идёт работа или нет? Я старалась изменять как можно меньше, чтобы меньше проблем могло возникнуть при портировании изменений, если есть куда. Вообще здесь есть что менять, поэтому нельзя ли выложить самую текущую версию, если такая есть, чтобы я могла развивать, не теряя уже проделанных другими изменений?
Настройки прокси мой вариант считывает из файла конфигурации, я выбрала /sys/network/zeroconf.ini, потому что в этом файле уже хранятся некоторые настройки сети и, кажется, есть смысл хранить другие настройки сети в том же месте. Может быть, стоит переименовать его в network.ini?
Пример файла с настройками:
Code: Select all
[ipconfig]
; type should be static or zeroconf
; zeroconf means the service first tries to contact a DHCP server
; If dhcp is not available, it switches to link-local
type = static
ip = 192.168.0.2
gateway = 192.168.0.1
dns = 192.168.0.1
subnet = 255.255.255.0
[proxy]
proxy = 192.168.0.1
port = 3128
;user = proxytest
;password= proxytest
- Attachments
-
-
downloader-src.7z (15.38 KiB)
- Исходные тексты.
Downloaded 290 times
-
downloader-bin.7z (3.28 KiB)
- Скомпилированная программа.
Downloaded 271 times
-
Сделаем мир лучше!
В нашем полку появилась КолибриВумен? Круто =) Респект.
Протестировал, у меня работает.
Протестировал, у меня работает.
CleverMouse, исходники должны быть на SVN, если не ошибаюсь. А за аккаунтом для SVN обратитесь к mike.dld.
К сожалению, протестировать не могу, так как у меня в Колибри сеть вообще не работает. Во всяком случае, респект))
К сожалению, протестировать не могу, так как у меня в Колибри сеть вообще не работает. Во всяком случае, респект))
Атауальпа, спасибо, конечно, за желание помочь, но "иногда лучше жевать, чем говорить". Достаточно небольшого изучения происходящего в Колибри, чтобы понять: обо всём или почти обо всём говорят на этом форуме. Второй по значимости ресурс - SVN, и обо всех изменениях там говорят тут за очень редкими исключениями. Для того, чтобы смотреть, что есть в репозитории, вовсе не нужен аккаунт. Я проверила содержимое репозитория перед тем, как задавать вопрос, - downloader там отсутствует.
Вопрос всем. Я подумала над созданием библиотеки для работы с сетью. Кажется, нормальная реализация совершенно стандартных функций типа gethostbyname, которые должны послать запрос и ждать ответа, невозможна. Потому что пробуждают поток при получении пакета функции работы с событиями, следовательно, функция должна уметь обрабатывать и остальные события, а это не в её компетенции. Я хочу запрещать остальные события внутри функции, но тогда в конце функции придётся восстанавливать маску событий, а сейчас нет API ядра для получения текущей маски. Поэтому вопрос: нет возражений против того, чтобы системная функция 40, которая сейчас ничего не возвращает, вместе с установкой маски возвращала бы предыдущую маску? Вроде ни на какие существующие программы это повлиять не должно.
И ещё один вопрос. При открытии соединения нужно указывать локальный порт. Если конкретное значение неважно, приходится организовывать перебор. Это несколько неудобно. Нет возражений против того, чтобы разрешить нуль для значения локального порта, чтобы ядро выбрало значение на своё усмотрение?
Я знаю, как на этом форуме относятся к тем, кто высказывает пожелания, но не делает ничего для их осуществления. Поэтому уточняю: я не прошу кого-то заниматься реализацией моих предложений, я собираюсь делать это сама.
Вопрос всем. Я подумала над созданием библиотеки для работы с сетью. Кажется, нормальная реализация совершенно стандартных функций типа gethostbyname, которые должны послать запрос и ждать ответа, невозможна. Потому что пробуждают поток при получении пакета функции работы с событиями, следовательно, функция должна уметь обрабатывать и остальные события, а это не в её компетенции. Я хочу запрещать остальные события внутри функции, но тогда в конце функции придётся восстанавливать маску событий, а сейчас нет API ядра для получения текущей маски. Поэтому вопрос: нет возражений против того, чтобы системная функция 40, которая сейчас ничего не возвращает, вместе с установкой маски возвращала бы предыдущую маску? Вроде ни на какие существующие программы это повлиять не должно.
И ещё один вопрос. При открытии соединения нужно указывать локальный порт. Если конкретное значение неважно, приходится организовывать перебор. Это несколько неудобно. Нет возражений против того, чтобы разрешить нуль для значения локального порта, чтобы ядро выбрало значение на своё усмотрение?
Я знаю, как на этом форуме относятся к тем, кто высказывает пожелания, но не делает ничего для их осуществления. Поэтому уточняю: я не прошу кого-то заниматься реализацией моих предложений, я собираюсь делать это сама.
Сделаем мир лучше!
CleverMouse
Судя по уже сделанному - ты серьезный человек.
А может все-таки ввести функцию возвращающую маску? А то вдруг коллизии какие объявятся, все-таки многие программы используют 40-ю функцию.Поэтому вопрос: нет возражений против того, чтобы системная функция 40, которая сейчас ничего не возвращает, вместе с установкой маски возвращала бы предыдущую маску? Вроде ни на какие существующие программы это повлиять не должно.
Если 0 никем не используется, то почему бы и нет.Нет возражений против того, чтобы разрешить нуль для значения локального порта, чтобы ядро выбрало значение на своё усмотрение?
Замечательно! Респекты буду писать по мере реализации.я собираюсь делать это сама.
Судя по уже сделанному - ты серьезный человек.
Теоретически это изменение может привести к расхождению, но практически никому этот eax=40 после вызова сисфункции не нужен. Пошарил по исходникам - 40-ю функцию действительно использует куча приложений (это, впрочем, было и так понятно), но ни одному не нужно значение eax после её вызова. Так что думаю, ни к чему плодить лишние сисфункции.CleverMouse wrote:Вроде ни на какие существующие программы это повлиять не должно.
... и запросто может привести к проблемам синхронизации, когда приложения A и B одновременно пытаются открыть соединение, A нашло свободный порт, тут произошло прерывание, B нашло этот же порт и открыло, и когда управление вернулось A, ни о чём не подозревающее A попытается использовать уже ставший занятым порт и сильно офигеет, когда это не получится. При реализации поиска в ядре можно хоть синхронизацию поставить. Кстати, в текущей реализации сетевой подсистемы вообще с блокировками напряг. И вообще там всё переписывать надо.CleverMouse wrote:Если конкретное значение неважно, приходится организовывать перебор. Это несколько неудобно.
Ушёл к умным, знающим и культурным людям.
CleverMouse wrote:чтобы ядро выбрало значение на своё усмотрение?
Это меня глючит или два человеа действительно сказали одно и тоже, но при этом как бы кто-то комуто возражает и поправляет?...diamond wrote:При реализации поиска в ядре можно хоть синхронизацию поставить
Не совсем, мой пост был дополнением (если угодно, поправкой), но я тоже за добавление такой возможности.Это меня глючит или два человеа действительно сказали одно и тоже, но при этом как бы кто-то комуто возражает и поправляет?...
Ушёл к умным, знающим и культурным людям.
Who is online
Users browsing this forum: No registered users and 2 guests