Вопрос про мульти-соединение на 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..