QUOTE
Если так не делать, то прийдется хранить все время в буффере все неподтвержденные пакеты, что увеличит объем использованной памяти во много раз.
А не надо так делать. Надо генерировать пакеты по необходимости.
У меня в стеке есть три callback'а для режима передачи
SEND - сгенерить новых данных для передачи (не более стольки-то) и вернуть количество сгенеренных данных.
REGENERATE - откатиться на точку последнего подтверждения
ACK - переместить точку последнего подтверждения на сколько-то байт.
CODE
char *out;
char *ack;
SEND(p,max)
{
len=max;
memcpy(p,out,len);
out+=len;
return len;
}
REGENERATE(p,max)
{
len=max;
memcpy(p,ack,len);
out=ack;
return len;
}
ACK(len)
{
ack+=len;
}
В начале out и ack указывают на начало буфера передачи.
На самом деле в реальности там нет memcpy. Это псевдокод для иллюстрации. На самом деле там какой-то циклический буфер, или железка, или еще чего - например, http-сервер в виде машины состояний, который непосредственно печатает в p, а ack и out для него - не более чем состояние.
QUOTE
а что не ясно то?
Да уже все ясно. Однопакетный стек. Тысячи их, uip впереди колонны шагает.