ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
30 июня
1440835
Balda (04.06.2024 13:56 - 14:02, просмотров: 568)
Вопрос про мульти-соединение на LWIP стеке или (помогите догрызть кактус) 

ситуация такая:
задача сделать 4 соединения по одному входящему порту (4шт)

RAW IP

4й месяц жру кактус и вот кажется, все поборол - и на тебе... какие то глюки вылезают

в чем проблема : устойчивость ко всем не адекватным событиям - потеря связи итд итп.

даю код с комментариями

калбек акцепта:


static err_t accept(void *arg, struct tcp_pcb *pcb, err_t err) { // set the receive callback for this connection if(pcb->local_port == PortTCP1) { tcp_setprio(pcb, TCP_PRIO_NORMAL); if (pcb_0->state != ESTABLISHED){ pcb_0 = pcb; to_sock0 = 0; } else if (pcb_1->state != ESTABLISHED){ pcb_1 = pcb; to_sock1 = 0; } else if (pcb_2->state != ESTABLISHED){ pcb_2 = pcb; to_sock2 = 0; } else if (pcb_3->state != ESTABLISHED){ pcb_3 = pcb; to_sock3 = 0; } else return ERR_CONN; tcp_arg (pcb, (void*)pcb); tcp_recv (pcb, mdb_tcp_recv); tcp_err (pcb, mdb_conn_err); tcp_sent (pcb, mdb_tcp_sent); tcp_poll (pcb, mdb_tcp_poll, 2); } return ERR_OK; }

смысл сего:

считаю что если соединение не установлено то структура PCB свободна.

далее отслеживаю тайм ауты:

тут колбек на 1 сек..

смысл если таймаут превышен - закрываю соединение

static err_t mdb_tcp_poll (void *arg, struct tcp_pcb *tpcb)
{
if (arg == pcb_0)
{
if ((to_sock0++) >= TO_Socket) Socket_Close(tpcb, NULL, 0xa0);
}
else if (arg == pcb_1)
{
if ((to_sock1++) >= TO_Socket) Socket_Close(tpcb, NULL, 0xa1);
}
else if (arg == pcb_2)
{
if ((to_sock2++) >= TO_Socket) Socket_Close(tpcb, NULL, 0xa2);
}
else if (arg == pcb_3)
{
if ((to_sock3++) >= TO_Socket) Socket_Close(tpcb, NULL, 0xa3);
}
return ERR_OK;
}


как закрываю :

если по команде от удаленной стороны то -> даю функцию CLOSE PCB

если по обрыву -> ABORT PCB

---

запустил спец прогу которая делает 1 соединение; потом рвет это соединение (типа тест устойчивости )

2е соединение адекватно и работает всегда!!

ну и, редко, сам откуда из вне читаю данные..

---

в чем ГЕМОРОЙ:??

все работает прекрасно день, два, неделю....

а потом, как погода на марсе...

хлобысь: все соединения якобы активны, хотя в реале - активно ОДНО из 4х..

-----

что удалось выяснить:

такое впечатление что не адекватно работает коолбек POLL

" почему то не срабатывает по таймауту не делает абборт PCB"

поэтому почему то PCB в статусе ESTABLISHED..