Цитата(Golikov A. @ May 22 2013, 19:19)

у вас очень маленькое окно, получается частые перепосылы и остановки.
вы подтверждаете весь пакет? tcp_recived(....)
там буфер р имеет кроме p->len еще и p->total_len, и ссылки на след пакеты, может пока туда-суда окно и забилось?
Насколько я понимаю подтверждение tcp_recived это для случая когда процессор принимает. Во всяком случае я так делал.
Код
err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
// обработка принятого пакета
tcp_recved(tpcb,p->tot_len);
pbuf_free(p);
}
Для случая передачи я просто вызываю calback функцию tcp_sent(ptcp_pcb, tcp_client_sent)
Хотя ее смысл мне не понятен (функцию взял из примера) в if программа не заходит.
Код
err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
{
struct tcp_client_struct *es;
LWIP_UNUSED_ARG(len);
es = (struct tcp_client_struct *)arg;
if(es->p_tx != NULL)
{
tcp_client_send(tpcb, es);
}
return ERR_OK;
}
вообще мой обработчик передачи крутится в основном цикле и выглядит примерно так
Код
void SendDataHandler(void)
{
// запаковка данных
if(tcp_sndbuf(ptcp_pcb) >= msg_len)
{
err = tcp_write(ptcp_pcb,&tx_tcp_msg,msg_len,1);
tcp_sent(ptcp_pcb, tcp_client_sent);
}
}
если err == ERR_OK значит данные переданы.
Сообщение отредактировал IgorKossak - May 23 2013, 12:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!