lwip编程有三种接口 :
LwIP - raw/callback API :
内核回调接口,这个比较高效,在不同类型连接(UDP和TCP)使用不相关的编程函数(udp_xxx 和 tcp_xxx),用户编程的方法是向内核注册各种自定义的回调函数,回调函数是与内核实现交换的唯一方式。函数比如有:
tcp_recved、tcp_recv、tcp_sent、tcp_err、tcp_accept、tcp_poll、tcp_arg
udp_sent、udp_sendto、udp_sendto_if、udp_input
缺陷:基于回调函数方式编程特点。从编程模式可以看出,用户应用程序与协议栈内核处于同一进程中,用户程序通过回调方式执行,这样的话,应用程序和协议栈讲就存在相互制约关系,用户程序执行的时候,内核一直等待状态,内核需要等待用户函数返回一个结果再继续执行。如果用户程序计算量很大,执行时间很长,则协议栈就得不到执行,协议栈的接收和发送新的数据包会受到影响。也可能出现丢包情况。
协议栈API(sequential API):
也称netconn编程,推荐使用这个进行lwip用户编程,函数有
netconn_new, netconn_delete, netconn_getaddr, netconn_connect, netconn_disconnect, netconn_listen, netconn_accept,netconn_recv, netconn_send, netconn_write, netconn_close
优点:解决raw/callback API编程缺陷,协议栈进程收到一个数据包之后,可以将数据包以邮箱的方式传递给用户进程,协议栈进程可以不被阻塞,继续接收处理下一个数据包。
BSD API(或者说 SOCKET API):
socket编程,不管不同类型连接(UDP和TCP),都给用户一个统一的编程接口,这个还不太完善,基于协议栈API简单封装实现,函数有
socket、bind、connect、listen、accept、sendto、write、recvfrom、read、close
在sockets.h里面定义