近日在学习lwip,在网上看到了原子哥的lwip开发手册,非常有帮助,于是按照手册移植了一下,已经可以ping通。
但在继续移植服务器端的时候对tcp_server_senddata函数产生了一些疑问。
在
开发板作客户端的时候tcp_client_senddata函数是这样的
[C]
纯文本查看 复制代码
//此函数用来发送数据void tcp_client_senddata(struct tcp_
PCB *tpcb, struct tcp_client_struct * es){struct pbuf *ptr; err_t wr_err=ERR_OK;while((wr_err==ERR_OK)&&es->p&&(es->p->len<=tcp_sndbuf(tpcb))){ptr=es->p;wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1); //将要发送的数据加入到发送缓冲队列中if(wr_err==ERR_OK){ es->p=ptr->next;//指向下一个pbufif(es->p)pbuf_ref(es->p);//pbuf的ref加一pbuf_free(ptr);//释放ptr }else if(wr_err==ERR_MEM)es->p=ptr;tcp_output(tpcb);//将发送缓冲队列中的数据立即发送出去} } 而在tcp_server_senddata
[C]
纯文本查看 复制代码
//此函数用来发送数据void tcp_server_senddata(struct tcp_pcb *tpcb, struct tcp_server_struct *es){struct pbuf *ptr;u16 plen;err_t wr_err=ERR_OK; while((wr_err==ERR_OK)&&es->p&&(es->p->len<=tcp_sndbuf(tpcb))) {ptr=es->p;wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1);if(wr_err==ERR_OK){ plen=ptr->len;es->p=ptr->next;//指向下一个pbufif(es->p)pbuf_ref(es->p);//pbuf的ref加一pbuf_free(ptr);tcp_recved(tpcb,plen); //更新tcp窗口大小}else if(wr_err==ERR_MEM)es->p=ptr; }} 问题有:
1.服务器发送倒数第二句tcp_recved调用的作用是什么?
2.为什么不掉用tcp_output将数据发送出去?
对lwip这块的初学,请大家指教。