如题,我用的LWIP官网例程改的,参考原子例程改了tcp_client_poll函数,如下:sta
tic err_t tcp_echoclient_connected(void *arg, struct tcp_
PCB *tpcb, err_t err)
{
struct echoclient *es = NULL;
es = (struct echoclient *)mem_malloc(sizeof(struct echoclient));
if (es != NULL)
{
es->state = ES_CONNECTED;
es->pcb = tpcb;
es->p_tx = NULL;
tcp_arg(tpcb, es);
//tcp_sent(tpcb, tcp_echoclient_sent);
tcp_poll(tpcb, tcp_echoclient_poll, 1);
err = ERR_OK;
}
static err_t tcp_echoclient_poll(void *arg, struct tcp_pcb *tpcb)
{
err_t ret_err;
struct echoclient *es;
es = (struct echoclient*)arg;
test6_init();
if (es != NULL)
{
es->p_tx = pbuf_alloc(PBUF_TRANSPORT, strlen((char*)test) , PBUF_POOL);
pbuf_take(es->p_tx, (char *)test, strlen((char *)test));
led_onf();
tcp_echoclient_send_test(tpcb, es);
//tcp_echoclient_send(tpcb, es);
if (es->p_tx)
pbuf_free(es->p_tx);
if(es->state == ES_CLOSING) tcp_echoclient_connection_close(tpcb, es);
ret_err = ERR_OK;
}
else
{
tcp_abort(tpcb);
ret_err = ERR_ABRT;
}
return ret_err;
}
static void tcp_echoclient_send_test(struct tcp_pcb *tpcb, struct echoclient * es)
{
struct pbuf *ptr;
err_t wr_err = ERR_OK;
while ((wr_err == ERR_OK) && ( es->p_tx != NULL) && (es->p_tx->len <= tcp_sndbuf(tpcb)))
{
ptr = es->p_tx;
wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 0);
if (wr_err == ERR_OK)
{
es->p_tx = ptr->next;
if(es->p_tx != NULL)
{
pbuf_ref(es->p_tx);
}
pbuf_free(ptr);
}
else if(wr_err == ERR_MEM)
{
es->p_tx = ptr;
}
tcp_output(tpcb);
}
}
其实和原子例程一模一样的,我每次回调cp_echoclient_poll的时候,重新复制es->p_tx,然后发送,可是会出现下图所示,要么接受不到,要么一下发好几个,接触LWIP已经两个周了,大概了解了下,有好多不懂的地方,求大神不吝赐教!