天线|RF射频
直播中

李秀珍

7年用户 944经验值
私信 关注
[问答]

请问服务器发送倒数第二句tcp_recved调用的作用是什么?

近日在学习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这块的初学,请大家指教。

回帖(7)

陈秀春

2019-10-29 07:11:01
1、tcp_recve()是用来更新接收窗口大小的,开发板作为服务器的时候要调用,做客户端的时候不需要调用。如果不调用tcp_receve()更新接收窗口的话,会使得服务器上的数据始终不能满足发送的窗口条件,从而导致该方向上的数据发送停止。
2、tcp_output()是将某个连接的TCP控制块中的unsend队列中的数据发送出去,这个函数用户不需要自己调用,因为LWIP在判断要发送的数据达到一定程度的时候会自动调用tcp_output()的,用户应用程序可以不用调用。
举报

张蕾

2019-10-29 07:28:12
1,有注释。
2,你可以测试下。
举报

孙灿

2019-10-29 07:43:53
我让我同事回复你。
lwip我也不太熟。
举报

陈红

2019-10-29 08:07:06
期待高人的回复
举报

更多回帖

发帖
×
20
完善资料,
赚取积分