Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> raw & http 
:(
    Опции темы
Loki
Дата 10.11.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Подскажите как скачать файл попакетно 1 пакет за 1 сессию. Т.е. послав запрос получив 1 пакет закрыть сессию и открыть слудующую с новый значением range. Загвоздка вышла вот в чем...
вот ту  я собираю пакет в raw...

Код

//......где-то там он начал собираться, а ниже склеиваются заголовки
bzero(&pseudo, 12+sizeof(struct tcphdr));
pseudo.source_address = ip_header->saddr;
pseudo.dest_address = ip_header->daddr;
pseudo.placeholder = 0;
pseudo.protocol = IPPROTO_TCP;
pseudo.tcp_length = htons(sizeof(struct tcphdr));
bcopy((char *)tcp_header, (char *)&pseudo.tcp, sizeof(struct tcphdr));
tcp_header->check = in_cksum((unsigned short *)&pseudo,20+ sizeof(struct tcphdr));
// тут по идее нужно как-то в рав засунуть протокол 4 уровня http с таким заголовким...
httpRequest(remote_ip_str, remote_port,
"GET "+url+" HTTP/1.0\r\n"
"Host: "+host+"\r\n"
"Cache-Control: no-cache\r\n"
"Pragma: no-cache\r\n"
"Content-Range: bytes "+start_len+"-"+end_len+"/-1\r\n"
"\r\n", buffer);
close(sock);
return 0;
}
void httpRequest(char host, int remote_port, int start_len, int end_len, char url, char *buffer) {
    char *buf, int len, int bufsize;
// потом тут как-то ресивить пакет, верифаить что это 1 пакет, открывать новую сессию
}

Придумал ограничивать скачивание 1 пакета по Content-Range. заранее предусмотрев знавение которое точно войдет в данные 1 пакета ресива.
Вот, подскажите как запихнуть http- заголовок в raw и как дальше принимать по 1 пакету?
p.s. возможно есть другой способ не юзая Content-Range, если есть, поделитесь плиз.
PM MAIL   Вверх
J0ker
Дата 10.11.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



Цитата(Loki @  10.11.2008,  15:34 Найти цитируемый пост)
протокол 4 уровня http

ээээ
экскьюзми, какой протокол какого уровня?


--------------------
user posted image
PM MAIL   Вверх
Loki
Дата 11.11.2008, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Ну ладно, тогда прсто... Как собрать пакет raw с http-методом get?
вот как я собираю добавляю данные в tcp-пакет...
dptr = (struct data *)(buffer+sizeof(struct iphdr)+sizeof(struct tcphdr));
Мне http-заголовок в данные подставлять или как?
PM MAIL   Вверх
J0ker
Дата 11.11.2008, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



берете соответствующий RFC, и смотрите какие поля чем заполнять
у вас проблема в том, что вы не понимаете как работает стек протоколов
протокол нижнего уровня ничего не знает о протоколе верхнего уровня - они изолированны
весь пакет верхнего уровня представляется нижнему уровню как данные
например для стека IP/TCP/HTTP - весь пакет HTTP - это данные пакета TCP, и в то-же время весь пакет TCP - это данные пакета IP


--------------------
user posted image
PM MAIL   Вверх
Loki
Дата 11.11.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Нет, это как раз понятно, верхний протокол строится на основе нижнего, только вот еще вопрос.
Если я реализую http- заголовок в виде структуры, например как у меня выше по коду...
Код

struct data{
char url[];
char host[];
int start_len;
int end_len
}data;

только вот становитяс немного не ясно, как передать не только сами значения которые мне нужны, а весь заголовок, тип метода итд...
PM MAIL   Вверх
J0ker
Дата 11.11.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



такую структуру как вы привели вы использовать не можете - в plain C, насколько я помню, массивы с опущеной длиной считаются нулевыми, а в C++ - запрещены
HTTP заголовок - это текст, состоящий из строк, разделенных '\n', конец заголовка - дополнительная '\n', далее, если есть контент, то идет контент, который заканчивается '\n'
Т.е., в терминах пересылки по сокету простейший запрос быдет выглядеть так:
Код

const char *req = "GET / HTTP/1.0\n\n";
send(sock, req, strlen(req), 0);

В терминах пакетов - "GET / HTTP/1.0\n\n" - должно находится в поле данных TCP пакета


--------------------
user posted image
PM MAIL   Вверх
Loki
Дата 12.11.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Да уже понял что только строчки=) 
Как узнать что файл закончился? Предварительно послать HEAD и вытащить len? Еще есть варианты как вовремя остановить закачку при оконцании файла? Или по recvfrom, если не нуль, как лучше?

Это сообщение отредактировал(а) Loki - 12.11.2008, 16:22
PM MAIL   Вверх
J0ker
Дата 12.11.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



Цитата(Loki @  12.11.2008,  16:05 Найти цитируемый пост)
Как узнать что файл закончился?

хедер ответа должен либо включать поле Content-Length, либо сервер должен разорвать соединение по окончании передачи ответа


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.