接收完数据后,调用tcp_recved扩大窗口。tcp_recved函数中,最关键的代码是 pcb->rcv_wnd += len; 也就是恢复或扩大窗口的意思。为什么呢? 因为tcp_receive函数在收到数据后,会把窗口缩小,表示接收数据的空间被刚收到的数据占用了,所以你在tcp_receive中可以看到这样的语句, pcb->rcv_wnd -= tcplen; pcb->r...
正确的用法是:在收到数据后,应用层调用tcp_recved函数恢复原来的窗口大小;而在发送函数中,不用管窗口的事! 源码全部贴在后面,这里讲解一些需要注意的地方 第一点 接收数据的PCB控制块只能是tcp_active_pcbs上面的,而不是我们创建的那个用于tcp_listen的监听控制块,这个块其实一直处于LISTEN状态,是不能收发数据的。...
通常在TCP控制块recv字段注册的回调函数中,用户在完成数据的处理后,必须调用tcp_recved更新接收窗口。
fflush(recv_f);// debug_printf("wrote %d bytes\n", n);tot += n;// debug_printf("for a total of: %d bytes\n", tot);// Inform TCP that we have taken the data.tcp_recved(pcb, pb->tot_len);// Free the packet bufferpbuf_free(pb); }// debug_printf("done tcp is recv\n"...
这里只讲raw编程,如果你使用LWIP-socket或netconn,那就不存在这个问题,这些高级函数会自己在合适的地方调用tcp_recved函数。问题的来源对于初学者而言,LWIP收不到数据是个常见的问题。有不少网络上流传的源码,一个典型的例子是tcp_echoserver。各个教学的资料中也都提供源码。但很可惜,这些教学板提供的源码缺乏可移植...
API进行应用程序编写时最容易出现的问题,原因在于用户程序处理完接收到的数据后,没有调用函数tcp_recved...