Цитата(scifi @ Dec 27 2010, 15:52)

Из Вашего объяснения я так и не понял, как устроена Ваша программа. Стек lwip требует, чтобы периодически (каждые 250 мс) вызывалась функция tcp_tmr().
Программа устроена так, как устроен пример в StellarisWare, В т.ч. вызывается tcp_tmr, т.к.диагностические сообщения от tcp_slow_tmr выводятся на консоль. В пример добавлен разбор запроса POST, а вместо send_data была попытка посылать что-либо, описанное выше... Это прекрасно работает при приёме файла из одного окна. Параллельно с этим прекрасно работает сайт из примера. Параллельно работает UDP на своём порту. Т.е.структура нормальная. While из моего вопроса означает, что я продолжаю обрабатывать принятые данные в коллбэчной функции http_recv и пытаться выдавать что-то с целью АСК'а, затем делать return до тех пор, пока не истечёт полученная в первом запросе POST длина Content Length.
Плюс "по наитию" сделано то, чего не было в примере - выемка данных из цепочки pbuf'ов:
p = p->next; if(p){..выемка..} else pbuf_free(pbuf0);, где pbuf0 - изначальный pbuf в цепочке. Не знаю, правильно это или нет.
Цитата(scifi @ Dec 27 2010, 15:52)

Функция tcp_recved() сообщает стеку, что можно посылать ACK и принимать новые данные. Не нужно делать tcp_write().
Да, без tcp_write получилось после переноса tcp_recvd из начала обработки (как было в примере) в конец, после выемки всей цепочки и выдачи по UARTу всех логов. Но duplicate ack всё равно остался: первый посылается tcp_recved, второй посылается после выхода из коллбэчной функции http_recv функцией tcp_input отсюда:
Код
/* If there were no errors, we try to send something out. */
if (err == ERR_OK) {
tcp_output(pcb);
Выглядит это так:
Код
12 2.096778 192.168.66.50 192.168.66.1 TCP http > 48728 [ACK] Seq=25 Ack=4381 Win=4096 Len=0
13 2.096824 192.168.66.1 192.168.66.50 TCP [TCP segment of a reassembled PDU]
14 2.096835 192.168.66.1 192.168.66.50 TCP [TCP segment of a reassembled PDU]
15 2.341158 192.168.66.50 192.168.66.1 TCP http > 48728 [ACK] Seq=25 Ack=5841 Win=4096 Len=0
16 2.341205 192.168.66.1 192.168.66.50 TCP [TCP segment of a reassembled PDU]
17 2.523333 192.168.66.50 192.168.66.1 TCP [TCP Dup ACK 15#1] http > 48728 [ACK] Seq=25 Ack=5841 Win=4096 Len=0
18 3.564769 192.168.66.1 192.168.66.50 TCP [TCP Retransmission] [TCP segment of a reassembled PDU]
66 1 - компьютер, 66 50 - контроллер.
Такие группы из двух нормальных АСК и одного дубликата идут при приёме всего файла. Сейчас только tcp_recved, tcp_write делается 1 раз в начале для ответа 200 ОК.
Как избавиться от дубликатов, пока не понятно.
А есть ли готовый пример с обработкой POST? Буду благодарен за помощь.