Использую цепочку колбеков, как и задумано в lwIP.
Но заполняю буфер передачи не полностью(узнаю из tcp_sndbuf(pcb); ).
Далее вызываю tcp_write(pcb, Data_Bf, wMaxPut, 0); и завершаю функцию.
Скорость никакущая.
Смотрю что идет по сетке - FTP клиент не посылает ACK добрых 0,3 сек.
Крепко думаю - доходит, что размер окна равен 2, а пакет уходит 1.
Рою сеть.
Нахожу вариант:
Код:
Код
pcb->flags |= TF_NODELAY; //отключаем Nagle
tcp_write(pcb, Data_Bf, wMaxPut >> 2, 1); //первый пакет
tcp_output(pcb); //передать что влезло
//второй пакет
tcp_write(pcb, &Data_Bf[wMaxPut >> 2], wMaxPut-(wMaxPut >> 2), 1);
tcp_output(pcb); //передать что влезло (опционально)
tcp_write(pcb, Data_Bf, wMaxPut >> 2, 1); //первый пакет
tcp_output(pcb); //передать что влезло
//второй пакет
tcp_write(pcb, &Data_Bf[wMaxPut >> 2], wMaxPut-(wMaxPut >> 2), 1);
tcp_output(pcb); //передать что влезло (опционально)
ACK сразу вываливаются на каждую пару пакетов и скорость вырастает в сотни раз. Здорово...
Только решение кривое.
Можно конечно набивать буфер под завязку
(как криво и не полностью сделано в WEB сервере ST).
Но это крайне неудобно.
Бить данные всегда на 2 куска - тоже левизна.
Кто то знает нормальное решение?