http качалка

...
  • Это вопрос скорее к ядерщикам. Файл записывается целиком, за 1 раз, функцией 70/2. Будет ли бред?

    В идеале следовало бы передавать файл вызывающей программе через общую память...
  • да, было бы здорово) например, прога вызывает downloader, передавая идентификатор расшаренной памяти, а downloader просто пишет в нее.. Вернее, два идентификатора, верно? Отдельно для заголовков.. // Хм, а можно еще и третий, с памятью на чтение, с текстом передаваемых заголовков..
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • При скачивании http://www.ya.ru и http://www.yandex.ru downloader, хотя и правильно всё скачивает и записывает на диск, но не завершается. (Тут нужно разбираться, может, это следствие общей кривости сетевого стека в ядре. Скажем, три FIN-пакета подряд от ядра серверу без какой-либо реакции сервера меня сильно удивляют.) Если при этом попытаться скачать http://www.wasm.ru, то downloader слетает:
    downbug2u.png
    downbug2u.png (3.99 KiB)
    Viewed 8746 times
    downbug2k.png
    downbug2k.png (5.32 KiB)
    Viewed 8746 times
    При скачивании http://www.wasm.ru (отдельно от первого теста) всё внешне выглядит нормально, программа завершается добровольно, но в /rd/1/.download оказывается фигня, начиная с "tml>" вместо "<html>". На доске отладки видно следующее:
    downbug3u.png
    downbug3u.png (5.06 KiB)
    Viewed 8748 times
    Ушёл к умным, знающим и культурным людям.
  • И ещё замечание. Сейчас один запрос разбивается на 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 296 times
  • Ага, уже лучше. Ещё замечания:
    1. Иногда страница не докачивается - вместо последнего пакета записываются нули. Иногда докачивается.
    2. Программа отжирает всё доступное процессорное время на пустые проверки, не пришло ли чего.
    3. При запуске из командной строки всё работает (по модулю первых двух примечаний). При запуске через GUI на wasm.ru вылетает.
    Ушёл к умным, знающим и культурным людям.
  • Тема заглохла или только кажется?
    В соседних темах просили поддержку прокси "с логином и паролем которые", я добавила в последнюю версию с исходниками работу через прокси, прошу потестировать и оценить.
    Вроде сказано, что "в перспективе 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
    
    Новые параметры я считываю из секции proxy. Параметр proxy задаёт адрес прокси и может быть ip-адресом или доменным именем, port - порт прокси. Для прокси с авторизацией есть два параметра user и password, если их нет, то программа считает, что авторизация не нужна.
    Attachments
    downloader-src.7z (15.38 KiB)
    Исходные тексты.
    Downloaded 286 times
    Скомпилированная программа.
    Downloaded 265 times
    Сделаем мир лучше!
  • В нашем полку появилась КолибриВумен? Круто =) Респект.
    Протестировал, у меня работает.
  • CleverMouse, исходники должны быть на SVN, если не ошибаюсь. А за аккаунтом для SVN обратитесь к mike.dld.
    К сожалению, протестировать не могу, так как у меня в Колибри сеть вообще не работает. Во всяком случае, респект))
  • Атауальпа, спасибо, конечно, за желание помочь, но "иногда лучше жевать, чем говорить". Достаточно небольшого изучения происходящего в Колибри, чтобы понять: обо всём или почти обо всём говорят на этом форуме. Второй по значимости ресурс - SVN, и обо всех изменениях там говорят тут за очень редкими исключениями. Для того, чтобы смотреть, что есть в репозитории, вовсе не нужен аккаунт. Я проверила содержимое репозитория перед тем, как задавать вопрос, - downloader там отсутствует.

    Вопрос всем. Я подумала над созданием библиотеки для работы с сетью. Кажется, нормальная реализация совершенно стандартных функций типа gethostbyname, которые должны послать запрос и ждать ответа, невозможна. Потому что пробуждают поток при получении пакета функции работы с событиями, следовательно, функция должна уметь обрабатывать и остальные события, а это не в её компетенции. Я хочу запрещать остальные события внутри функции, но тогда в конце функции придётся восстанавливать маску событий, а сейчас нет API ядра для получения текущей маски. Поэтому вопрос: нет возражений против того, чтобы системная функция 40, которая сейчас ничего не возвращает, вместе с установкой маски возвращала бы предыдущую маску? Вроде ни на какие существующие программы это повлиять не должно.

    И ещё один вопрос. При открытии соединения нужно указывать локальный порт. Если конкретное значение неважно, приходится организовывать перебор. Это несколько неудобно. Нет возражений против того, чтобы разрешить нуль для значения локального порта, чтобы ядро выбрало значение на своё усмотрение?

    Я знаю, как на этом форуме относятся к тем, кто высказывает пожелания, но не делает ничего для их осуществления. Поэтому уточняю: я не прошу кого-то заниматься реализацией моих предложений, я собираюсь делать это сама.
    Сделаем мир лучше!
  • CleverMouse
    Поэтому вопрос: нет возражений против того, чтобы системная функция 40, которая сейчас ничего не возвращает, вместе с установкой маски возвращала бы предыдущую маску? Вроде ни на какие существующие программы это повлиять не должно.
    А может все-таки ввести функцию возвращающую маску? А то вдруг коллизии какие объявятся, все-таки многие программы используют 40-ю функцию.
    Нет возражений против того, чтобы разрешить нуль для значения локального порта, чтобы ядро выбрало значение на своё усмотрение?
    Если 0 никем не используется, то почему бы и нет.
    я собираюсь делать это сама.
    Замечательно! Респекты буду писать по мере реализации.
    Судя по уже сделанному - ты серьезный человек.
  • CleverMouse wrote:Вроде ни на какие существующие программы это повлиять не должно.
    Теоретически это изменение может привести к расхождению, но практически никому этот eax=40 после вызова сисфункции не нужен. Пошарил по исходникам - 40-ю функцию действительно использует куча приложений (это, впрочем, было и так понятно), но ни одному не нужно значение eax после её вызова. Так что думаю, ни к чему плодить лишние сисфункции.
    CleverMouse wrote:Если конкретное значение неважно, приходится организовывать перебор. Это несколько неудобно.
    ... и запросто может привести к проблемам синхронизации, когда приложения A и B одновременно пытаются открыть соединение, A нашло свободный порт, тут произошло прерывание, B нашло этот же порт и открыло, и когда управление вернулось A, ни о чём не подозревающее A попытается использовать уже ставший занятым порт и сильно офигеет, когда это не получится. При реализации поиска в ядре можно хоть синхронизацию поставить. Кстати, в текущей реализации сетевой подсистемы вообще с блокировками напряг. И вообще там всё переписывать надо.
    Ушёл к умным, знающим и культурным людям.
  • CleverMouse wrote:чтобы ядро выбрало значение на своё усмотрение?
    diamond wrote:При реализации поиска в ядре можно хоть синхронизацию поставить
    Это меня глючит или два человеа действительно сказали одно и тоже, но при этом как бы кто-то комуто возражает и поправляет?...
  • Это меня глючит или два человеа действительно сказали одно и тоже, но при этом как бы кто-то комуто возражает и поправляет?...
    Не совсем, мой пост был дополнением (если угодно, поправкой), но я тоже за добавление такой возможности.
    Ушёл к умным, знающим и культурным людям.
  • Who is online

    Users browsing this forum: No registered users and 3 guests