一 LWIP 三种API接口方式
1、使用raw/callback API编程,用户编程的方法是向内核注册各种自定义的回调函数,回调函数是与内核实现交换的唯一方式。
recv_udp, accept_function, sent_tcp, recv_tcp, do_connected, poll_tcp, err_tcp!
基于该接口来实现LwIP网络编程时,协议栈与用户程序之间通信是通过回调函数来实现的。
此时用户程序和协议栈内核运行于同一个进程中,是一种最直接的利用协议栈的方法,应用程序通过函数注册的方式与内核产生联系,在内核相关事件发生时,用户函数通过回调的方式被执行。用户程序通过回调执行的方式取得协议栈中的数据。
NOTE:(1)Raw/Callback可以方便的构造出一个服务器对多个客户端的TCP并发连接。
(2)Sequential API只能通过多线程的方式来实现并发连接。
弊端:因为应用程序协议栈内核在一个线程中执行,所以两者出现相互制约,回调函数执行的时候,内核会处于等待状态,等待用户程序处理结果再执行,如果应用程序的计算量大,执行时间长,接收数据、发送数据效率会产生影响,可能出现丢包
==》该方式不适合在多任务、交互数据量大、数据处理时间开销长的应用场景使用
该方式需要使用者对内核理解透彻,不适合初学者。但是适合低成本MCU不跑os,数据交互不大的系统。
当工程师需要使用低成本联网方案时候可以理解透彻lwip内核,在此基础上开发那些下发配置,隔段时间上传产生的记录,心跳的项目使用或者数据量不大响应时间要求高的项目。当项目中一段时间或者全程需要大数据量下发和别的事务处理时候不建议使用。
原文链接:https://blog.youkuaiyun.com/alingbo/article/details/85038325
2、协议栈API(sequential API)是基于raw/callback API实现的,它与内核交换的方式也只能通过回调。
netconn_new, netconn_delete, netconn_getaddr, netconn_connect, netconn_disconnect, netconn_listen, netconn_accept,
netconn_recv, netconn_send, netconn_write, netconn_close
注: netconn_send 是给UDP使用的。
netconn_write是给TCP使用的。但是tcp发送时,有三种选择:
(1)NETCONN_COPY 标志告诉协议栈将待发送数据拷贝到内核进程所属的内存空间,在这种情况下,会消耗系统的部分时间和内存资源,但是用户进程
可以在向内核提交数据后立即重新使用这些数据区域,甚至删除这些区域,而不必等待内核是否完全正确发送。如果用户没有设置该位,则内核构造发送
数据包是,会引用这些发送数据的内存区域,在这种情况下,用户进程不能再对这些数据进行修改,这种方式通常用在静态数据(ROM数据)的发送中。
对于非ROM数据的发送,用户应尽量设置NETCONN_COPY标志。
(2)NETCONN_MORE标志,当其置位时,组装这些数据的最后一个TCP报文段首部PSH标志将被设置,这样,数据在接收端将被尽快的递交给上层,而不会缓冲等待。
3、BSD API(或者说 SOCKET API),是Lwip设计者对sequential API函数进行了简单封装后的函数。
socket、bind、connect、listen、accept、sendto、write、recvfrom、read、close。
sendto、recvfrom:主要用于UDP,但是也可用于TCP。
write、read:主要用于TCP,但是也可用于UDP。