近日在学习lwip,在网上看到了原子哥的lwip开发手册,非常有帮助,于是按照手册移植了一下,已经可以ping通。
但在继续移植服务器端的时候对tcp_server_senddata函数产生了一些疑问。
在开发板作客户端的时候tcp_client_senddata函数是这样的
[mw_shl_code=c,true]//此函数用来发送数据
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; //指向下一个pbuf
if(es->p)pbuf_ref(es->p); //pbuf的ref加一
pbuf_free(ptr); //释放ptr
}else if(wr_err==ERR_MEM)es->p=ptr;
tcp_output(tpcb); //将发送缓冲队列中的数据立即发送出去
}
}
[/mw_shl_code]
而在tcp_server_senddata
[mw_shl_code=c,true]//此函数用来发送数据
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; //指向下一个pbuf
if(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;
}
}
[/mw_shl_code]
问题有:
1.服务器发送倒数第二句tcp_recved调用的作用是什么?
2.为什么不掉用tcp_output将数据发送出去?
对lwip这块的初学,请大家指教。 |