![]() |
|
Модераторы: feodorv |
![]()
|
|
| Loki |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 9.7.2006 Репутация: нет Всего: нет |
Подскажите как скачать файл попакетно 1 пакет за 1 сессию. Т.е. послав запрос получив 1 пакет закрыть сессию и открыть слудующую с новый значением range. Загвоздка вышла вот в чем...
вот ту я собираю пакет в raw...
Придумал ограничивать скачивание 1 пакета по Content-Range. заранее предусмотрев знавение которое точно войдет в данные 1 пакета ресива. Вот, подскажите как запихнуть http- заголовок в raw и как дальше принимать по 1 пакету? p.s. возможно есть другой способ не юзая Content-Range, если есть, поделитесь плиз. |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
||||
|
||||
| Loki |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 9.7.2006 Репутация: нет Всего: нет |
Ну ладно, тогда прсто... Как собрать пакет raw с http-методом get?
вот как я собираю добавляю данные в tcp-пакет... dptr = (struct data *)(buffer+sizeof(struct iphdr)+sizeof(struct tcphdr)); Мне http-заголовок в данные подставлять или как? |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
берете соответствующий RFC, и смотрите какие поля чем заполнять
у вас проблема в том, что вы не понимаете как работает стек протоколов протокол нижнего уровня ничего не знает о протоколе верхнего уровня - они изолированны весь пакет верхнего уровня представляется нижнему уровню как данные например для стека IP/TCP/HTTP - весь пакет HTTP - это данные пакета TCP, и в то-же время весь пакет TCP - это данные пакета IP |
|||
|
||||
| Loki |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 9.7.2006 Репутация: нет Всего: нет |
Нет, это как раз понятно, верхний протокол строится на основе нижнего, только вот еще вопрос.
Если я реализую http- заголовок в виде структуры, например как у меня выше по коду...
только вот становитяс немного не ясно, как передать не только сами значения которые мне нужны, а весь заголовок, тип метода итд... |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
такую структуру как вы привели вы использовать не можете - в plain C, насколько я помню, массивы с опущеной длиной считаются нулевыми, а в C++ - запрещены
HTTP заголовок - это текст, состоящий из строк, разделенных '\n', конец заголовка - дополнительная '\n', далее, если есть контент, то идет контент, который заканчивается '\n' Т.е., в терминах пересылки по сокету простейший запрос быдет выглядеть так:
В терминах пакетов - "GET / HTTP/1.0\n\n" - должно находится в поле данных TCP пакета |
|||
|
||||
| Loki |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 9.7.2006 Репутация: нет Всего: нет |
Да уже понял что только строчки=)
Как узнать что файл закончился? Предварительно послать HEAD и вытащить len? Еще есть варианты как вовремя остановить закачку при оконцании файла? Или по recvfrom, если не нуль, как лучше? Это сообщение отредактировал(а) Loki - 12.11.2008, 16:22 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
хедер ответа должен либо включать поле Content-Length, либо сервер должен разорвать соединение по окончании передачи ответа |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |