以太网学习(2)-- 网络协议简介

2023-10-31

目录

一、协议简介

二、协议间报文封装与拆封

三、LWIP简介

四、Lwip文件说明

4.1)如何获取LWIP源码文件

 4.2)LWIP文件说明

lwip目录

src目录

core目录

4.3)查看lwip的说明文档

五、LWIP的三种编程接口

5.1) RAW/Callback API

5.2)NETCONN API

5.3)SOCKET API 


一、协议简介

互联网的本质是数字通信,任何数字通信都离不开通信协议的制定,任何通信设备只有按照约定的、统一的方式封装和解析数据才能够实现收发双方的通信交互。互联网通信所要遵守的众多协议被统称位TCP/IP。

TCP/IP是一个协议族,是一个多层协议系统,每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。。对于开发人员听到最多就是就是应用层协议,比如HTTP、FTP、MQTT等。

TCP/IP是一个庞大的协议族,是众多协议的结合,这些协议按照功能可以划分为不同的层次,某些协议的实现要依赖于其它协议。依据这种依赖关系可以将协议进行分层,低层协议为相邻的上层协议提供服务,是上层协议得以实现的基础。

TCP/IP分层如下图所示:

物理层(PHY):规定了传输信号所需要的物理电平、介质特征。

链路层(MAC):规定了数据帧能被网卡接收的条件,最常见的方式就是利用网卡的MAC地址,发送方会在欲发送的数据帧的首部加上接收方网卡的MAC地址信息,接收方只有监听到属于自己的MAC地址信息后,才会去接收并处理该数据。

网络层:每台设备网络都应该有自己的网络地址,网络层规定了主机的网络地址该如何定义,以及如何在网络地址和MAC地址之间进行映射,及ARP协议。

传输层:网络层实现了数据包在主机之间的传递,而每一台主机内部可能运行着多个网络程序,传输层的功能就是区分数据包是属于哪一个应用程序的,可以说传输层实现了数据包端到端的传递,另外,数据包在传输过程中可能出现丢包、乱序、和重复的现象,网络层并没有提供应对这些错误的机制,而传输层可以解决这些问题,如TCP协议。

应用层:应用层以下的工作实现了数据的传递工作,应用层则决定了你如何应用和处理这些数据,之所以会有这么多的应用层协议,因为互联网中传输数据的种类很多,差异很大,应用场景也十分多样。

二、协议间报文封装与拆封

当用户发送数据时,数据会向下进行一层一层的封装,首先先将应用层数据向下交给传输层,这是应用层的操作,接下来传输层会在数据的前面加上传输层的首部,然后向下交给网络层。同样的网络层也会在数据前面加上网络层首部,完后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路层首部,然后将数据交给网卡。最后网卡将数据转换为物理链路上的电平信号,数据就这样被发送到网络中了,数据发发送的过程可以概况为TCP/IP的个层协议对数据进行封装的过程,如下图所示:

当设备的网卡接收到某个数据包后,会将其放在网卡的接收缓冲区中,并告知TCP/IP内核,然后TCP/IP内核就开始工作,它会将数据从接收缓冲区中取出,并逐层解析数据包中协议首部信息,并最终将数据交给某个应用程序,数据接收的过程与发送的过程正好相反,可以概括为TCP/IP的各层协议对数据进行解析的过程。

三、LWIP简介

lwip(Light Weight IP),轻量级TCP/IP协议,是瑞典计算机科学院的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈,LWIP设计的初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈。实现的重点是保持TCP协议的主要功能的基础上减少对RAM的占用。此外LWIP既可以移植到操作系统上运行,也可以在无操系统的情况下运行。

LWIP主要有以下特性:

1.支持ARP协议(以太网地址解析协议)

2.支持ICMP协议(控制报文协议),用于网络的调与维护

3.支持IGMP协议(互联网组管理协议),可以实现多包数据的接收

4.支持UDP协议(用户数据报协议)

5.支持TCP协议(传输控制协议)

6.支持PPP协议(点对点通信协议),支持PPPoE

7.支持DNS域名解析

8.支持DHCP协议,动态分配IP地址

9.支持IP协议,包括IPv4,IPv6协议,支持IP分片和重装功能,多网络接口下的数据包转发

10.支持SNMP协议(简单网络管理协议)

11.支持AUTOIP,自动IP地址配置

12.提供专门的内部回调接口(Raw API),用于提高应用程序性能

13.提供可供选择的Socket API、NETCONN API(在多线程情况下使用)

四、Lwip文件说明

4.1)如何获取LWIP源码文件

 http://savannah.nongnu.org/projects/lwip/

这个主页简单的介绍了一下LWIP,然后给了许多链接,这里我们只关注两个地方。

 点击“project homepage”,会得到一个网页,这个网页可以看成是lwip的官网说明文档,我们可以通过这个网页获得关于lwip的很多信息,包括LWIP的使用注意、数据的拷贝、系统的初始化流程等。点击后的内容如下图所示:

 点击“Download Area”,会得到一个网页,通过这个网页,我们可以下载到LWIP所有的版本源代码包和contrib包(里面是移植和应用LWIP的一些demo,即应用实例),点击每一个红色字体的资源链接,浏览器就会开启一个ftp连接,帮助你下载想要的文件到电脑中。Download Area的内容如下所示:

另外还有一些“.sig”后缀的文件,这是数字签名,大家忽略就好。

 4.2)LWIP文件说明

lwip目录

打开lwip2.1.3文件夹如下图所示

 该目录下的内容为:

①  CHANGELOG :文件记录了 LwIP 在版本升级过程中源代码发生的变化。

②  COPYING :文件记录了 LwIP 这个开源软件的 license。一个软件开源,不代表你 能无限制地使用它,你需要在使用它的过程中遵守一定的规则,这些规则就是 license。大 家可以用记事本打开这个 COPYING 文件看看它的内容。开源软件的 license 有很多种,LwIP 的属于 BSD License。LwIP 的开源程度是很高的,你几乎可以无限制地使用它。

③  FILES :文件用于介绍当前目录下的目录信息。

④  README :文件对 LwIP 进行了一个简单的介绍。

⑤  UPGRADING: 文件记录了 LwIP 每个大版本的更新,会对用户使用和移植 LwIP 造成的影响。所谓大版本更新指的是:1.3.x - 1.4.x – 2.0.x – 2.1.x。小版本更新,比如 2.0.1 – 2.0.2 – 2.0.3,这个过程只是一些 bug 的修复和性能的改善,不会对用户的使用造成影响。 用户只要将原有工程的目录中与 LwIP 相关的旧版本文件替换成新版本的文件,重新编译, 就能直接使用。

⑥  doc :文件夹里面是关于 LwIP 的一些文档,可以看成是应用和移植 LwIP 的指南。 但是这些文档比较零散,不成体系,而且纯文本阅读起来很费劲,阅读意义不是很大。

⑦  test :文件夹里面是测试 LwIP 内核性能的源码,将它们和 LwIP 源码加入到工程中 一起编译,调用它们提供的函数,可以获得许多与 LwIP 内核性能有关的指标。这种内核 性能测试功能,只有非常专业的人士才用的到。

⑧  src: 文件夹里面就是我们最关心的 LwIP 源码文件,下面会详细讲解

src目录

打开src文件夹如下图所示:

 该目录下的内容为:

①  api :文件夹里面装的是 NETCONN API 和 Socket API 相关的源文件,只有在操作系统的 环境中,才能被编译。

②  apps :文件夹里面装的是应用程序的源文件,包括常见的应用程序,如 httpd、mqtt、 tftp、sntp、snmp 等。

③  core: 文件夹里面是 LwIP 的内核源文件,后续会详细讲解。

④  include :文件夹里面是 LwIP 所有模块对应的头文件。

⑤  netif :文件夹里面是与网卡移植有关的文件,这些文件为我们移植网卡提供了模板,我 们可以直接使用。

lwip内核是由一系列模块组合而成的,这些模块包括:TCP/IP协议栈的各种协议、内存管理模块、数据包管理模块、网卡管理模块、网卡接口模块、基础功能类模块、API模块。每个模块是由相关的几个源文件和头文件组成的,通过头文件对外声明一些函数、宏、数据类型,使得其它模块可以方便地调用此模块的功能。而构成每个模块的文件都被组织在include目录中,而源文件则根据类型被分散地组织在api、apps、core、netif目录中。

core目录

core存放的是LWIP的内核源文件,打开如下图所示:

 接下来我们逐一介绍这些源文件的功能:

ipv4:文件夹里面是与IPv4模块相关的源文件,它实现了IPv4协议规定的对数据包的各种操作。ipv4文件夹中还包括一些并非属于IP协议,但会受IP协议影响的协议源文件包括DHCP、ARP、ICMP、IGMP。

ipv6:文件夹里面是与IPv6模块相关的源文件,它实现了IPV6协议规定的对数据包的各种操作。IPv6文件夹中还包括一些并非属于IP协议,但会受IP协议影响的协议源文件,包括DHCP、ARP、ICMP、IGMP。

altcp.c、altcp_alloc、altcp_tcp.c等文件是应用程序分层TCP连接API,从TCPIP线程使用,是一个抽象层,可以模拟应用程序的tcp回调API。

def.c文件定义了一些基础类函数,比如主机序和网络字节序的转换、字符串的查找和比较、整数转换为字符串等,这些函数会被LWIP内核的很多模块所调用。在include 目录里面的def.h文件对外声明了def.c所实现的函数,同时定义了许多宏,能实现一些基础操作,比如取最大值、最小值、数值长度等。

dns.c文件实现了域名的解析的功能,有了它,用户就可以在知道服务器域名的情况下,获得该服务器的IP地址。很多时候我们只记得服务器域名而不记得服务器IP地址,例如“”www.baidu.com“这就是一个域名,通过dns功能,我们就可以得到服务器域名对应的IP地址,这给用户使用带来了很大的方便。

inet_chksum.c问价提供了LWIP所需的校验和功能,在IP、UDP、TCP协议的实现中,需要计算校验和。

init.c文件对LWIP用户宏配置进行了检查,会将配置错误和不合理的地方,通过编译器的#error和#waring功能表示出来。另外,init.c定义了lwip_init初始化函数,这个函数会依次对lwip的各个模块进行初始化。

ip.c文件实现了IP协议相关的函数,但是只封装了ipv4和ipv6文件夹中的函数

mem.c文件实现了动态内存池管理机制,使得lwip内核的各个模块可以灵活的申请和释放内存。

memp.c文件实现了静态内存堆管理机制,使得lwip内核的各个模块可以快速的申请和释放内存。

netif.c文件实现了网卡的操作,比如注册/删除网卡、使能/禁能网卡、设置网卡IP地址等。netif与include目录中的netif文件公用构成了lwip的netif模块,它对网卡进行了抽象,使得LWIP内核可以方便的管理多个特性各异的物理网卡。

pbuf.c文件实现了lwip网络数据包的各种操作。网络数据包在lwip内核中以pbuf结构体的形式存在,这提高了lwip内核对数据包的处理效率,以及提高了数据包在各层之间的传递效率。

raw.c实现了一个传输层协议的框架,我们可以在它的基础上修改和添加代码,实现自定义的传输层协议,与UDP/TCP作为传输层协议。但有时,底层网络开发人员会嫌UDP的可靠性太差,或者TCP虽然可靠性强,但是很耗费时间和内存,他们需要根据实际需求,平衡利弊,定义自己的传输层协议。

stat.c文件实现了lwip内核的统计功能,使用户可以实时的查看lwip内核对网络数据包的处理情况。

sys.c文件和sys.h文件构成了LWIP的sys模块,它提供了与临界区相关的操作

tcp.c、tcp_in.c和tcp_out.c文件实现了TCP协议,包括对TCP连接的操作、对TCP数据包的输入输出操作和TCP定时器,它们和include目录中名称带tcp的头文件共同构成了LWIP的TCP模块。

timeouts.c定义了LWIP内核的超时处理机制。LWIP内核中多个模块的实现需要借助超时处理机制,包括ARP表项的时间统计、IP分片报文的重装、TCP的各种定时器、实现各种应用层协议需要的超时处理。

udp.c文件实现了UDP协议,包括对UDP连接的操作和UDP数据包的操作。

4.3)查看lwip的说明文档

我们一般点击左侧的”Modules“,查看模块相关的说明,以及例子。如下图所示

 还有一些用户常用的API函数,也是可以在"Modules"中找到。

 还有应用层相关的说明可以在"Application"中找到,数据结构相关的可以在”Data Structures“中查看详细说明。

五、LWIP的三种编程接口

Lwip提供了三种编程接口,分别为RAW/Callback API 、NETCONN API、SOCKET API。它们的易用性从左到右依次提高,而执行效率从左到右依次降低。

5.1) RAW/Callback API

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)基于回调函数开发应用程序的思维过于复杂。利用回调函数去实现复杂的业务程序时,会很麻烦,而且代码的可读性比较差。

(2)在操作系统环境中,应用程序代码和内核代码处于同一线程,虽然能够节省任务间通信和切换任务的开销,但是相应的,应用程序的执行会制约内核程序的执行,不同的应用程序之间也会相互制约。在应用程序执行过程中,内核程序将不可能得到运行,这会影响到网络数据包的处理效率。如果应用程序占用的时间过长,而且碰巧这时又有大量的数据包到达,由于内核代码长期得不到执行,网卡接收缓存的数据包就持续积累,到时候很可能因为满载而丢弃一些数据包,而造成丢包的现象,

5.2)NETCONN API

在操作系统环境中,可以使用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那样简单易用。比如NETCONN API的读数据API,用户获得的是一个特殊的数据结构netbuf,用户如果想要使用好它就要对内核的pbuf和netbuf结构体有所了解,我们会在后续进行讲解。NETCONN API之所以采用这种设计,就是为了避免数据包在内核程序和应用程序之间发生拷贝,从而降低程序运行效率。当然,用户如果不在数据递交时的效率问题,也可以把netbuf中的数据取出来拷贝到一个数组中,然后去处理这个数组。

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

(1)相较于RAW/Callback API,NETCONN API 简化了编程工作,使用户可以按照操作文件的方式来操作网络连接。但是,内核程序和网络程序之间的数据包传递,需要依靠操作系统的信号量和邮箱机制完成,这需要耗费更多的时间和内存,另外还加上任务切换的时间,效率低。

(2)相较于Socket API ,NETCONN API 避免了内核程序和网络程序之间的数据拷贝,提高了数据传递的效率。但是,NETCONN API 的易用性不如Sockst API 好,他需要用户对LWIP内核所使用的数据结构有一定的了解。

5.3)SOCKET API 

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

不同的系统有自己的一套socket接口。Windows系统中支持的是WinSock,UNIX/Linux 系统支持的是BSD Socket,它们虽然风格不一致,但是大同小异,如果想要移植不同操作系统的网络应用程序到使用LWIP的系统中,需要注意。

相较于NETCONN API,Socket API具有更好的易用性。使用Socket API编写的程序可读性好,便于维护,也便于移植到其他操作系统中。Socket API 在内核程序和应用程序之间存在数据拷贝,所以数据的传递效率会差于NETCONN API。另外,lwip的Socket API 是基于NETCONN API 实现的,所以效率上不如前者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太网学习(2)-- 网络协议简介 的相关文章

  • voronoi图编程构造_可视化编程真的有那么糟糕?

    作者 Anton Livaja 译者 弯月 责编 屠敏 以下为译文 我想告诉你 如果使用恰当 可视化编程和是图解推理是一个非常强大的工具集 也就是说 只有当可视化编程扎根于数学和计算机科学并建立坚实的基础 才能发挥良好的作用 为了降低编程的
  • 《职场情绪稳定:内在的力量与策略》

    近期发生的新闻热点 如大规模裁员 创业公司倒闭 公共卫生事件等 让公众更加关注稳定情绪和心理健康的问题 在职场中 我们常常遇到各种挑战和压力 如何保持稳定的情绪成了一个重要的话题 首先 让我们分享一些工作中可能引发我们情绪波动的事情 我曾经
  • IT项目管理七

    Tony Prince 和他的团队正在做一个娱乐和健康方面的项目 他们被要求修改现有的成本估计 以便能有一个可靠的评价项目绩效的基线 你的进度和成本目标是在6个月内在200 000美元的预算下完成项目 1 作业一 准备和打印一页类似于图7
  • 求n个数的最小公倍数(C语言)

    Problem Description 求n个数的最小公倍数 Input 输入包含多个测试实例 每个测试实例的开始是一个正整数n 然后是n个正整数 Output 为每组测试数据输出它们的最小公倍数 每个测试实例的输出占一行 你可以假设最后的
  • java项目 畅购商城 购物车

    第10章 购物车 学习目标 能够通过SpringSecurity进行权限控制 掌握购物车流程 掌握购物车渲染 微服务之间的认证访问 1 SpringSecurity权限控制 用户每次访问微服务的时候 先去oauth2 0服务登录 登录后再访

随机推荐

  • 网易游戏(互娱)游戏研发一面&二面(已收到offer)

    简单来讲下上周面网易互娱的心得 因为我不是走内推而是直接怼笔试的 所以上周才有了笔试结果然后被告知面试 我面的岗位是游戏研发工程师 初级 一面 40分钟左右 开始是简单的自我介绍 C 关于C 问的比较简单 因为我跟面试官说我主要学的是Jav
  • 风格回调函数 vs c++风格虚基类

    http www cnblogs com raymon archive 2012 08 28 2660876 html 风格回调函数 vs c 风格虚基类 关于接口定义和调用的对比 c 中也很常用回调函数 比如MFC中 既可以用回调函数的方
  • APP移动端自动化基础及appium环境搭建

    目录 APP移动端自动化测试基础 主流移动端自动化工具 Appium介绍 Appium工作原理 Appium环境搭建 安装前准备工具 安装Android SDK 配置环境变量 安装Python client 安装夜神模拟器 mumu模拟器
  • 一文一图搞懂OSI七层模型

    什么是OSI 所谓的OSI 是由国际化标准组织 ISO 针对开放式网路架构所制定的电脑互连标准 全名是开放式通讯系统互连参考模型 Open System Interconnection Reference Model 简称OSI模型 该模型
  • Air780E

    目录 Air780E编译指南 准备工作 下载源码 注意 需要两个库 准备工具 工具链下载 开始编译 常见编译问题 Air780E编译指南 https wiki luatos com develop compile Air780E html
  • 全面深入彻底理解Python切片操作【原创】

    全面深入彻底理解Python切片操作 原创 我们基本上都知道Python的序列对象都是可以用索引号来引用的元素的 索引号可以是正数由0开始从左向右 也可以是负数由 1开始从右向左 在Python中对于具有序列结构的数据来说都可以使用切片操作
  • 系统权限-数据权限案例分析

    文章目录 前言 一 数据权限 三 源代码下载 四 数据库权限设计图 五 数据权限前台界面 六 数据权限服务端 6 1 aop 拦截 数据范围 6 2 数据实现层ServiceImpl 埋点 七 总结 7 1设计思路 7 2 缺陷 前言 传统
  • TestNG单元测试框架-常用注解介绍以及testng和Junit的区别【杭州多测师_王sir】【杭州多测师】...

    一 TestNG单元测试框架 常用注解介绍 testng学习网址 https www jc2182 com testng testng environment html 1 Before类别和After类别注解按照如下循序执行 Before
  • Java实体类中封装其他实体类并引用

    在Java开发过程中有很多情况是二个表及以上的联合操作 这是需要分清楚表的主次关系 在引用的时候有人会把二个表的数据全都封装在一个实体类中 然后在对这个实体类进行操作 但如果是三个表呢 四个表呢 还都封装在一个实体类吗 这样被封装的实体类的
  • C++ #ifndef、#define、#endif作用

    在C 项目中 ifndef define endif非常常见 接下来就来简单说一下它们的作用 作用 防止头文件被重复引用 防止被重复编译 简介 ifndef 它是if not define的简写 是宏定义的一种 确切的说是预处理功能 宏定义
  • 邮件附件乱码小技巧

    经常有人收到一些Internet邮件 里面有一个附件 例如文件名叫 我的WORD文档 doc 可是用WORD打开后 提示错误或者乱码 遇到这种情况可以用以下步骤解决 1 重命名 把 我的WORD文档 doc 改名字为 我的WORD文档 uu
  • 基于BCM53262交换芯片平台的Linux操作系统移植(三)之配置文件修改

    2018 05 09 10 49 zhoulinhua 2018 05 10 一 单板类型支持 1 修改at91sam9x5ek defconfig定制软件匹配当前单板 buildroot at91 configs at91sam9x5ek
  • windows往磁盘拷文件,拒绝访问

    1 首先确保该盘的权限 全部设置成完全 2 设置完后 如果还会遇到问题 客户端没有所需的特权 方法 cmd以管理权限打开 输入 icacls c setintegritylevel M
  • 视锥裁剪

    背景 视锥体 frustum 是指场景中摄像机的可见的一个锥体范围 它有上 下 左 右 近 远 共6个面组成 在视锥体内的景物可见 反之则不可见 为提高性能 只对其中与视锥体有交集的对象进行绘制 我们计算出视锥体六个面的空间平面方程 将点坐
  • C++:构造、析构、引用与拷贝构造

    构造函数 类的构造函数是类的一种特殊的成员函数 它会在每次创建类的新对象时执行 类的数据成员多为私有的 要对它们进初始化 必须用一个公有函数来进行 同时这个函数应该在且仅在定义对象时自动执行一次 这个函数就是构造函数 它由系统自动调动 用户
  • 一个sql很多个not like的简化语句 (not like 多个值的简化语句)(原创)

    我 SELECT FROM table WHERE zongbu NOT REGEXP 北京 大连 鞍山 天津 香港 沈阳 我 SELECT FROM cpu bidding where bid project name not REGEX
  • Java面试不通过?RabbitMQ你熟悉了吗?

    1 rabbitmq 的使用场景有哪些 跨系统的异步通信 所有需要异步交互的地方都可以使用消息队列 就像我们除了打电话 同步 以外 还需要发短信 发电子邮件 异步 的通讯方式 多个应用之间的耦合 由于消息是平台无关和语言无关的 而且语义上也
  • [sitemap 索引情况提示] 根据 sitemap 的规则[0],当前页面 [pages/index/index] 将被索引

    sitemap 索引情况提示 根据 sitemap 的规则 0 当前页面 pages index index 将被索引 一 报错信息 总结 一 报错信息 代码如下 示例 sitemap 索引情况提示 根据 sitemap 的规则 0 当前页
  • C++ 内存池 -- C++ Memory Pool

    本文翻译版本出自 http blog csdn net 060 archive 2006 10 08 1326025 aspx 原文作者 DanDanger2000 原文链接 http www codeproject com cpp Mem
  • 以太网学习(2)-- 网络协议简介

    目录 一 协议简介 二 协议间报文封装与拆封 三 LWIP简介 四 Lwip文件说明 4 1 如何获取LWIP源码文件 4 2 LWIP文件说明 lwip目录 src目录 core目录 4 3 查看lwip的说明文档 五 LWIP的三种编程