LWIP(二)——LWIP有3种编程接口,RAW、NETCONN和SOCKET

news2024/11/24 10:56:51

目录

1. RAW

2. NETCONN

3、SOCKET


        LWIP有3种编程接口,RAWNETCONNSOCKET。它们的易用性从左到右依次提高,而执行效率从左到右依次降低,用户可以根据实际情况,平衡利弊,选择合适的 API 进行网络应用程序的开发。

1. RAW

        RAW/Callback API 是指内核回调型的 API, 这在许多通信协议的 C 语言实现中都有所应用。

        RAW/Callback API 是 LwIP 的一大特色, 在没有操作系统支持的裸机环境中,只能使用这种 API 进行开发,同时这种 API 也可以用在操作系统环境中。

        这里先简要说明一下“回调”的概念。 你新建了一个 TCP 或者 UDP 的连接,你想等它接收到数据以后去处理它们, 这时你需要把处理该数据的操作封装成一个函数,然后将这个函数的指针注册到LwIP 内核中。 LwIP 内核会在需要的时候去检测该连接是否收到数据,如果收到了数据,内核会在第一时间调用注册的函数,这个过程被称为“回调”,这个注册函数被称为“回调函数”。 这个回调函数中装着你想要的业务逻辑,在这个函数中,你可以处理接收到的数据,也可以发送任何数据,也就是说,这个回调函数就是你的应用程序。

        到这里,我们可以发现, 在回调编程中, LwIP 内核把数据交给应用程序的过程就只是一次简单的函数调用,这是非常节省时间和空间资源的。 每一个回调函数实际上只是一个普通的 C 函数,这个函数在 TCP/IP 内核中被调用。每一个回调函数都作为一个参数传递给当前 TCP 或UDP 连接。而且,为了能够保存程序的特定状态,可以向回调函数传递一个指定的状态,并且这个指定的状态是独立于 TCP/IP 协议栈的。 

  在有操作系统的环境中, 如果使用 RAW/Callback API,用户的应用程序就以回调函数的形式成为了内核代码的一部分, 用户应用程序和内核程序会处于同一个线程之中,这就省去了任务间通信和切换任务的开销了。

  简单来说, RAW/Callback API 的优点有两个:

  (1)可以在没有操作系统的环境中使用。
  (2) 在有操作系统的环境中使用它, 对比另外两种 API, 可以提高应用程序的效率、节省内存开销。

  RAW/Callback API 的优点是显著的,但缺点也是显著的:
  (1) 基于回调函数开发应用程序时的思维过程比较复杂。在后面与 RAW/CallbackAPI 相关的章节中可以看到, 利用回调函数去实现复杂的业务逻辑时, 会很麻烦,而且代码的可读性较差。
  (2) 在操作系统环境中, 应用程序代码与内核代码处于同一个线程,虽然能够节省任务间通信和切换任务的开销,但是相应地,应用程序的执行会制约内核程序的执行,不同的应用程序之间也会互相制约。 在应用程序执行的过程中,内核程序将不可能得到运行,这会影响网络数据包的处理效率。如果应用程序占用的时间过长,而且碰巧这时又有大量的数据包到达, 由于内核代码长期得不到执行,网卡接收缓存里的数据包就持续积累,到最后很可能因为满载而丢弃一些数据包,从而造成丢包的现象。

2. NETCONN

        在操作系统环境中,可以使用 NETCONN API 或者 Socket API 进行网络应用程序的开发。 NETCONN API 是基于操作系统的 IPC 机制(即信号量和邮箱机制) 实现的, 它的设计将 LwIP 内核代码和网络应用程序分离成了独立的线程。如此一来, LwIP 内核线程就只负责数据包的 TCP/IP 封装和拆封,而不用进行数据的应用层处理,大大提高了系统对网络数据包的处理效率。

  前面提到,使用 RAW/Callback API 会造成内核程序和网络应用程序、 不同网络应用程序之间的相互制约,如果使用 NETCONN API 或者 Socket API,这种制约将不复存在。

  在操作系统环境中, LwIP 内核会被实现为一个独立的线程, 名为 tcpip_thread,使用NETCONN API 或者 Socket API 的应用程序处在不同的线程中,我们可以根据任务的重要性,分配不同的优先级给这些线程,从而保证重要任务的时效性, 分配优先级的原则具体见下表。

         

        NETCONN API 使用了操作系统的 IPC 机制, 对网络连接进行了抽象,用户可以像操作文件一样操作网络连接(打开/关闭、读/写数据)。 但是 NETCONN API 并不如操作文件的 API 那样简单易用。

        举个例子,调用 f_read 函数读文件时,读到的数据会被放在一个用户指定的数组中,用户操作起来很方便,而 NETCONN API 的读数据 API,就没有那么人性化了。 用户获得的不是一个数组,而是一个特殊的数据结构 netbuf,用户如果想使用好它,就需要对内核的 pbuf 和 netbuf 结构体有所了解。 NETCONN API 之所以采取这种不人性的设计,是为了避免数据包在内核程序和应用程序之间发生拷贝,从而降低程序运行效率。当然, 用户如果不在意数据递交时的效率问题, 也可以把 netbuf 中的数据取出来拷贝到一个数组中,然后去处理这个数组。

  简单来说, NETCONN API 的优缺点是:

  (1) 相较于 RAW/Callback API, NETCONN API 简化了编程工作,使用户可以按照操作文件的方式来操作网络连接。 但是,内核程序和网络应用程序之间的数据包传递,需要依靠操作系统的信号量和邮箱机制完成,这需要耗费更多的时间和内存,另外还要加上任务切换的时间开销,效率较低。
  (2) 相较于 Socket API, NETCONN API 避免了内核程序和网络应用程序之间的数据拷贝,提高了数据递交的效率。 但是, NETCONN API 的易用性不如 Socket API 好,它需要用户对 LwIP 内核所使用数据结构有一定的了解。

3、SOCKET

  Socket,即套接字,它对网络连接进行了高级的抽象,使得用户可以像操作文件一样操作网络连接。它十分易用, 许多网络开发人员最早接触的就是 Socket 编程, Socket 已经成为了网络编程的标准。在不同的系统中,运行着不同的 TCP/IP 协议,但是只要它实现了Socket 的接口,那么用 Socket 编写的网络应用程序就能在其中运行。可见用 Socket 编写的网络应用程序具有很好的可移植性。

  不同的系统有自己的一套 Socket 接口。 Windows 系统中支持的是 WinSock,UNIX/Linux 系统中支持的是 BSD Socket,它们虽然风格不一致, 但大同小异。 LwIP 中的Socket API 是 BSD Socket。但是 LwIP 并没有也没办法实现全部的 BSD Socket,如果开发人员想要移植 UNIX/Linux 系统中的网络应用程序到使用 LwIP 的系统中,就要注意这一点。

  相较于 NETCONN API, Socket API 具有更好的易用性。使用 Socket API 编写的程序可读性好,便于维护,也便于移植到其它的系统中。 Socket API 在内核程序和应用程序之间存在数据的拷贝,这会降低数据递交的效率。 另外, LwIP 的 Socket API 是基于NETCONN API 实现的,所以效率上相较前者要打个折扣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性价比高的香港物理服务器怎么选用?

​  从事跨境业务,对于网络流量大且速度、安全网络要求高的企业,通常建议选用香港物理服务器。物理服务器以非共享方式租给一个特定的客户,比较满足一些企业的高要求。当然,在进行比较并选择性价比高的香港物理服务器时&#xf…

Flink 知识点整理及八股文问题<第二、三部分 Flink快速上手和部署>

本篇为Flink的第二、三部分&#xff0c;Flink快速上手和Flink部署&#xff0c;全篇参考自 尚硅谷2022版1.13系列 整个系列的目录如下&#xff1a; &#x1f49a;<一>Flink简介 &#x1f49a;<二>Flink快速上手 &#x1f49a;<三>Flink 部署 &#x1f49a;&l…

Revit标注墙偏移如何简便标注呢?万能标注?

一、Revit标注墙偏移如何简便标注呢? 1、如果墙定位线是核心层中心线&#xff0c;现在要标注墙偏移如何简便标注呢? 遇到上述问题大家可能想到的办法是用TAB键去选择墙的内外边缘。其实有更简便的方法&#xff0c;如图1所示。 红色框选部分是选项栏&#xff0c;当使用对齐尺寸…

JDBC高级——主键回显、批量插入、事务操作

自增主键回显 一般在插入数据时&#xff0c;设置主键为自增&#xff0c;然后我们就不用去维护这个主键值&#xff0c;其他的级联表可能以这个主键作为外键或参考&#xff0c;所以我们要拿到插入数据的主键值&#xff0c;这就是主键回显。 如何获取数据库自增的主键值&#xff…

自己写一个简单的工作流引擎V2

上一篇文中我们实现了顺序的工作流&#xff0c;对于多分支的工作流如下&#xff0c;该如何实现呢&#xff1f; 小明提交了一个申请单&#xff0c;然后经过经理审批&#xff0c;如果通过&#xff0c;发邮件通知&#xff0c;不通过&#xff0c;则打回重新填写申请单&#xff0c;…

计算机体系结构 | 函数栈帧 | 栈帧的创建与销毁讲解 | 篡改函数的返回地址

文章目录前言预备知识demo及其汇编代码汇编代码讲解返回值篡改&#xff08;111 ???&#xff09;前言 复习时遇到一些问题&#xff0c;可能是关于左值右值的概念理解不够透彻&#xff0c;于是转头去研究左值右值的问题&#xff0c;但是想要参透左右值&#xff0c;我又觉得需…

通信网络概论

一、通信网络概述 通信网络是一些设备、设施组成的集合&#xff0c;可以提供特定的服务&#xff0c;即可以实现位于任意地点的不同用户间信息的传递。 通信网络的基本问题&#xff1a;如何以尽可能低的成本有效地解决处于任何地理位置的任意两个用户之间即时信息传递问题&…

基于java springmvc+mybatis学生考试系统设计和实现

基于java springmvcmybatis学生考试系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

公司选择之外包

前言 简单介绍下人们常说的外包是什么&#xff0c;应届生未出社会没有经验&#xff0c;避免求职过程中的一些坑。 文章目录前言一、什么是外包&#xff1f;1、简介1、项目外包2、人力外包二、外包公司有哪些&#xff1f;三、优缺点1、优点2、缺点四、选择一、什么是外包&#x…

FreeRTOS的Systick和HAL时基

目录 分析 举个例子&#xff1a; 正确的做法&#xff1a; 总结 我们首先需要知道&#xff0c;使用了FreeRTOS会强制使用systick作为自己的心跳&#xff0c;这个os_tick的优先级是最低的&#xff0c;它主要的作用就是OS任务调度&#xff0c;时间片查询等工作。 在图中&#x…

【未解决乌龟问题】测试ROS是否安装成功

前提说明&#xff1a;虚拟机、ubuntu-18.04.1 1、操作流程&#xff1a; 1&#xff09;参考教程链接1&#xff0c;第一步输入roscore指令查看ROS的版本、节点、端号等内容时出现“Command roscore not found, but can be installed with: sudo apt install python-roslaunch”…

python-docx写入word

目录 字体大小参照 安装python-docx 引入依赖包 使用 标题设置字体、字号、居中、加粗、颜色 正文设置字体、字号、居中、加粗、颜色 添加图片 官方文档 字体大小参照 字号‘八号’对应磅值5 字号‘七号’对应磅值5.5 字号‘小六’对应磅值6.5 字号‘六号’对应磅值7.…

Java8-19新特性一览 ,认识全新的前沿技术

文章目录Java8-19新特性一览 ,认识全新的前沿技术前言你的收获Java发展趋势准备工作新特性1、接口private1&#xff09;、说明2&#xff09;、案例3&#xff09;、注意2、类型推断1&#xff09;、说明2&#xff09;、案例3&#xff09;、注意3、空指针优化1&#xff09;、说明2…

【5】SCI易中期刊推荐——计算机科学(中科院2区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

阿里云k8s一键部署有状态StatefulSet nacos2.0.3

阿里云k8s一键部署有状态StatefulSet nacos2.0.3 项目目录 centos 配置连接集群 kubectl 客户端执行k8s脚本 kubectl 执行结果&#xff0c;一键生成StatefulSetpodServiceconfig Deployment pod重启ip和名称随机分配&#xff0c;适合java服务类部署 StatefulSet pod重启ip和名…

再学C语言31:函数——递归

C允许一个函数调用其自身&#xff0c;这种调用过程被称为递归&#xff08;recursion&#xff09; 使用递归的风险&#xff1a;如果程序中没有设定可以终止递归的条件检测&#xff0c;会无限制地执行递归调用 所以涉及递归的程序需要谨慎设计 递归一般可以替代循环语句使用&a…

Mozi僵尸网络(P2P僵尸网络Mozi)

Mozi僵尸网络概述 Mozi僵尸网络是于2019年底首次出现在针对路由器和DVR 的攻击场景上的一种P2P僵尸网络。主要攻击物联网&#xff08;IoT&#xff09;设备&#xff0c;包括网件、D-Link和华为等路由设备。它本质上是Mirai的变种&#xff0c;但也包含Gafgyt和IoT Reaper的部分代…

springboot mybatis mysql快速开始(详细入门操作)(二)

七、创建service类。要注意相应的注解service,autowired不能丢&#xff0c;不然系统识别不到这些组件。里面写对应的mapper方法。Service public class SplineService { private static final Logger log LoggerFactory.getLogger(SplineService.class); Autowired private Sp…

国产音频ADC芯片的应用以及选型

想要让模拟信号和数字信号顺利“交往”&#xff0c;就需要一座像“鹊桥”一样的中介&#xff0c;将两种不同的语言转变成统一的语言&#xff0c;消除无语言障碍。这座鹊桥就是转换器芯片&#xff0c;也就是ADC芯片。ADC芯片的全称是Analog-to-Digital Converter, 即模拟数字转换…

设计模式_创建型模式 -《单例模式》

设计模式_创建型模式 -《单例模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 创建型模式的主要关注点是“怎样创建对象&#xff1f;”&#xff0c;它的主要特点是“将对象的创建与使用分离”。 这样…