欢迎光临爽报娱乐新闻 YesDaily.com




lwIP RAW API 界面的TCP服务器搭建中你必须要注意的事

发布时间:2024-11-25 爽报 YesDaily.COM 212

其实针对不同的TCP/IP协议栈,都有着不同的API界面函数,但是本质上都是一样的,这里我们说下lwIP的RAW API界面搭建TCP Server 的流程和相关的注意事项,应该同样适用于其他的协议栈,只是界面不同而已。有的事项虽然都知道,但是稍不注意,你搭建的TCP 服务器就会出个这样的问题。

TCP服务器搭建流程

之前的文章也有说过搭建一个TCP服务器的流程,现在把基于lwIP RAW API界面的TCP搭建流程再说下

  • 使用tcp_new 创建一个TCP 传输控制块tcp_pcb

  • 使用tcp_bind绑定IP地址和埠号

  • 使用tcp_listen将tcp_pcb设置为监听状态

  • 使用tcp_accept注册accept回调函数

  • 使用tcp_recv注册recv接收函数recv_fun

  • 在接收函数recv_fun内进行数据的处理

  • 数据处理完成以后释放对应tcp_pcb

服务器搭建流程中的问题及其注意事项

  • 之前也搭建过UDP服务器,怎么没有监听这一步呢

答案是:监听存在的前提是基于连接,TCP是基于连接的,而UDP是无连接的传输服务。

  • tcp_recv 中记得对端主动关闭连接的处理

通常情况下,我们使用tcp_recv函数为tcp_pcb注册相应的接收函数tcp_recv_fn,在内核收到数据以后,注册的tcp_recv_fn函数会被内核调用,从而开始处理连接上接收到的数据。所以tcp_recv 一般是在连接建立后被调用,对于server 来说tcp_recv函数会在accept函数中调用,对于客户端来说tcp_recv会在connected中被调用。

但是千万要注意:当内核检测到对方主动关闭连接的时候,也会调用recv函数,而且此时一个显著的标志就是数据字段为空,所以服务器端一定要针对数据字段为空的情况下调用tcp_close来关闭本地到对端的连接。

  • 更新接收窗口的函数tcp_recved很重要

在tcp_recv函数中,当应用程序完成对数据的处理以后,连接的任何一方需要调用tcp_recved函数来告诉内核:我已经成功的处理完了数据,你可以删除这个数据并继续接受其他数据了。其实,这个函数的本质是更新接收窗口的大小。这个函数的调用至关重要,如果你在tcp_recv内没有调用该函数,很有可能导致接收窗口为0,进而导致客户端无法再发送数据。

还有其他注意事项,欢迎大家补充


标签:  
0