Не могу скачать файл через Интернет (сокеты)
От: Иван Россия  
Дата: 25.08.07 16:32
Оценка:
Всем добрый день! Вот желаю написать программку для скачивания с серверов файлов по желаемому списку, но что-то не особо получается, виснет на этапе чтения сокета, при этом подключается нормально. Просьба особо не бить, в С новичек. На данный момент там используется буфер по BUFSIZ, то есть более этого размера не скачает, но меня сейчас не это волнует...
Кроме этого, мне непонятно, если сервер требует авторизации — как быть с этим?

Использую реальные ссылки (программой читаются из файла ulist, в нем первая строка — пример использования логина/пароля, но данные ссылки их не должны на сервере требовать):

http://static.jetune.ru/mp3/prev/89/886180/Perilous_Times.mp3
http://static.jetune.ru/mp3/prev/8/75214/The_Final_Frontier.mp3

Это тестовые маленькие файлы на 10-15 секунд.

Собственно проект (малынькый, правда) — http://files.rsdn.ru/68697/kach.c
http://files.rsdn.ru/68697/kach.h
http://files.rsdn.ru/68697/ulist


Да, забыл сказать — проект на Линюксе (Эклипс), но с Виндой, думаю, разница небольшая...
Пожалуйста, памажите
Да пребудет в нами С-ла!
Re: Не могу скачать файл через Интернет (сокеты)
От: Roman Odaisky Украина  
Дата: 25.08.07 16:57
Оценка:
Здравствуйте, Иван, Вы писали:

И>Всем добрый день! Вот желаю написать программку для скачивания с серверов файлов по желаемому списку, но что-то не особо получается, виснет на этапе чтения сокета, при этом подключается нормально. Просьба особо не бить, в С новичек. На данный момент там используется буфер по BUFSIZ, то есть более этого размера не скачает, но меня сейчас не это волнует...


Э-э… А где ты запрос в сокет пишешь?! "GET /uri HTTP/1.1\nHost: www.some.host" или что-то вроде?

И>Кроме этого, мне непонятно, если сервер требует авторизации — как быть с этим?


Выкинуть велосипед и использовать libcurl. А лучше, перейти на более другой язык — зачем тебе C для такой задачи? Например, так:
use Net::HTTP;
my $s = Net::HTTP->new(Host => "www.perl.com") || die $@;
$s->write_request(GET => "/", 'User-Agent' => "Mozilla/5.0");
my($code, $mess, %h) = $s->read_response_headers;

while(1)
{
    my $buf;
    my $n = $s->read_entity_body($buf, 1024);
    die "read failed: $!" unless defined $n;
    last unless $n;
    print $buf;
}

А то и так:
#!/bin/sh

xargs wget <ulist
До последнего не верил в пирамиду Лебедева.
Re: Не могу скачать файл через Интернет (сокеты)
От: Иван Россия  
Дата: 25.08.07 17:13
Оценка:
Учу исключительно (!) для обучения С (чистому). Я вполне могу пользоваться wget или виндовым GetRight.
C++, также как сторонние библиотеки, просьба не предлагать.
Да пребудет в нами С-ла!
Re[2]: Не могу скачать файл через Интернет (сокеты)
От: Roman Odaisky Украина  
Дата: 25.08.07 18:08
Оценка:
Здравствуйте, Иван, Вы писали:

И>Учу исключительно (!) для обучения С (чистому). Я вполне могу пользоваться wget или виндовым GetRight.

И>C++, также как сторонние библиотеки, просьба не предлагать.

Тогда отправь в сокет HTTP-запрос, потому что в твоей программе этого не наблюдается.
До последнего не верил в пирамиду Лебедева.
Re[2]: Не могу скачать файл через Интернет (сокеты)
От: ffk  
Дата: 28.08.07 05:57
Оценка:
Здравствуйте, Иван, Вы писали:

И>Учу исключительно (!) для обучения С (чистому). Я вполне могу пользоваться wget или виндовым GetRight.

И>C++, также как сторонние библиотеки, просьба не предлагать.

Для лучшего понимания HTTP протокола можешь запустить уже собранный curl с ключем -v
что-то типа: curl -v ya.ru, посмотришь как формируется HTTP запрос
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.