Полная версия этой страницы:
LwIP 1.3.2 HTTP
k000858
Apr 2 2013, 14:44
имеется web сервер на lwip, страничка с методом POST, библиотека contrib httpserver_raw
С некоторых браузиров (например Safari) запрос запрос приходит в 2х пакетах (2 сегмента) и так уж получается, что сами параметры оказываются именно во втором пакете, который LwIP почему то напрочь игнорит.
в библиотеке есть дифайн LWIP_HTTPD_SUPPORT_REQUESTLIST, как я понимаю именно он включает поддержку HTTP запроса частями, к сожалению, его включение ничего не даёт. кто работал с библиотекой, подскажите как отпарсить параметры с помощью этой библы + если запрос в 2х частях
Можно перейти на lwip-1.4.x, там HTTP сервер существенно доработан.
lwIP не имеет HTTP ни сервера ни клиента в своем составе, проблема в библиотеке которая поверх работает.
k000858
Apr 2 2013, 15:30
Цитата(scifi @ Apr 2 2013, 19:15)

Можно перейти на lwip-1.4.x, там HTTP сервер существенно доработан.
боюсь, мне пока переход не осилить. проект на stm32f407
Цитата(kan35 @ Apr 2 2013, 19:19)

lwIP не имеет HTTP ни сервера ни клиента в своем составе, проблема в библиотеке которая поверх работает.
к lwip идет набор библиотек contrib
http://download.savannah.gnu.org/releases/lwip/drivers/ из которой и была взята библиотека HTTP сервера
Цитата(k000858 @ Apr 2 2013, 19:30)

боюсь, мне пока переход не осилить. проект на stm32f407
Ну тогда можно попытаться сделать так, чтобы запрос приходил в 1 сегменте, изменяя настройки lwip.
k000858
Apr 2 2013, 17:46
Цитата(scifi @ Apr 2 2013, 21:40)

Ну тогда можно попытаться сделать так, чтобы запрос приходил в 1 сегменте, изменяя настройки lwip.
сейчас такие настройки. запрос почему то разделился на два сегмента в 536 и 116 байт
пробовал PBUF_POOL_BUFSIZE делать 1024, результата не принесло
CODE
/* ---------- Memory options ---------- */
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
byte alignment -> define MEM_ALIGNMENT to 2. */
#define MEM_ALIGNMENT 4
/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#define MEM_SIZE (10*1024)
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
sends a lot of data out of ROM (or other static memory), this
should be set high. */
#define MEMP_NUM_PBUF 10
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
per active UDP "connection". */
#define MEMP_NUM_UDP_PCB 6
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
connections. */
#define MEMP_NUM_TCP_PCB 10
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 6
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
segments. */
#define MEMP_NUM_TCP_SEG 12
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
timeouts. */
#define MEMP_NUM_SYS_TIMEOUT 3
/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE 12
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE 512
/* ---------- TCP options ---------- */
#define LWIP_TCP 1
#define TCP_TTL 255
/* Controls if TCP should queue segments that arrive out of
order. Define to 0 if your device is low on memory. */
#define TCP_QUEUE_OOSEQ 0
/* TCP Maximum segment size. */
#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF (4*TCP_MSS)
/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
#define TCP_SND_QUEUELEN (2* TCP_SND_BUF/TCP_MSS)
/* TCP receive window. */
#define TCP_WND (2*TCP_MSS)
QUOTE (k000858 @ Apr 2 2013, 21:46)

сейчас такие настройки. запрос почему то разделился на два сегмента в 536 и 116 байт
пробовал PBUF_POOL_BUFSIZE делать 1024, результата не принесло
Если увеличение PBUF_POOL_BUFSIZE не помогло, то, видимо, разделение действительно происходит при отправке. По-хорошему, надо научить HTTP-сервер обрабатывать данные, приходящие даже побайтно. Но, как вариант, для отправки можно использовать не POST, а GET-запрос, тогда параметры (если их немного) будут в первом сегменте.
k000858
Apr 3 2013, 14:07
GET в момем случае не подходит: параметров много, да и светить в адресной строке их не хотелось бы.
HTTP сервер почему то просто не видит второй пакет..
Цитата(k000858 @ Apr 3 2013, 18:07)

HTTP сервер почему то просто не видит второй пакет..
Понятно почему: на последующие сегменты просто не смотрит. Так проще, и обычно работает. Но теоретически каждый сегмент может иметь размер 1 байт, как упомянул Gunner. В следующих версиях lwip contrib этот косяк устранён.
k000858
Apr 4 2013, 02:46
Цитата(scifi @ Apr 3 2013, 18:12)

Понятно почему: на последующие сегменты просто не смотрит. Так проще, и обычно работает. Но теоретически каждый сегмент может иметь размер 1 байт, как упомянул Gunner. В следующих версиях lwip contrib этот косяк устранён.
ну...судя по всему выбора у меня не остается. буду обновляться на 1.4.1
к сожалению, с lwip только начал знакомиться..по-этому вопросов будет много.
помимо библиотек самой lwip имеется папочка port, ну она тупо берется из новой версии (хотя может и от старой подойдет?!)
так же есть ethernetif.c(.h), в нем что то править надо будет?
Цитата(k000858 @ Apr 4 2013, 06:46)

так же есть ethernetif.c(.h), в нем что то править надо будет?
Если я правильно помню, мне при переходе 1.3 -> 1.4 ничего править не пришлось. Попробуйте, вдруг пройдёт безболезненно?
k000858
Apr 4 2013, 15:06
обновил стек до 1.4.1, так же обновил библиотеки HTTP сервера из contrib для 1.4.1
ситуация не изменилась, второй http пакет не видится.
кто работал с это библиотекой на базе LwIP ??? (библа во вложении)
так же есть проблема: устройство на LwIP подключено по ethernet к роутеру, по вай-фай к этому же роутеру подключен айфон, с сафари на айфоне не удается зайти на веб страницу устройства.
vlad_new
Apr 5 2013, 13:31
В свое время я провозился с этим с месяц. Этот сервер везде воляется как демонструха. Сначала пытался подправить эту фигню. Тоже мучился с дефайнами прикручивал библиотеку последней версии и т. д. Вообщем что то как то получилось но всеравно криво. Потом плюнул на все это и взял за основу проэкт сервера из Кейла. Кое что подправил и сейчас имею прекрасный быстрый сервер без глюков.
QUOTE (vlad_new @ Apr 5 2013, 17:31)

В свое время я провозился с этим с месяц. Этот сервер везде воляется как демонструха. Сначала пытался подправить эту фигню. Тоже мучился с дефайнами прикручивал библиотеку последней версии и т. д. Вообщем что то как то получилось но всеравно криво. Потом плюнул на все это и взял за основу проэкт сервера из Кейла. Кое что подправил и сейчас имею прекрасный быстрый сервер без глюков.
Из Кейла только проект сервера брали или сам стек TCP/IP там тоже свой?
vlad_new
Apr 5 2013, 14:05
Подправил порты и eth драйвер под себя. Загрузил и все сразу заработало. Потом при тестировании нашел пару ошибок. Исправил и все полетело. Потом уже обнаружил, что в последней версии кейловцы уже сами нашли эти ошибки и исправили. В конференции на сервере кейла нашел как прикрутить все остальное. Мне еще udp нужен был. Чуть чуть еще их визард пришлось подправить (снял ограничения на колличество одновременных запросов). Ну как то так. Правда мне пока не удалось запустить этот проэкт на 168мгц. Работает только до 130. Ну похоже это уже модемный чип виноват. Щас буду менять его на другой. Сервер одинаково хорошо работает и в монопольном режиме и под Rtx, что очень порадовало.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.