顺序表简述顺序表是用一段物理地址连续的储存单元依次存储数据元素的线性结构,一般情况采用数组存储。
在数组上完成增删查改。
顺序表分类与实现静态顺序表使用定长的数组存储元素
静态实现12345678#define N 100typedef int ListData; //类型重定义 //要存什么类型的数据就定义什么类型typedef struct SeqList{ ListData* data[N]; //数据指针 int size; //数据数量}SL;
静态顺序表只能存储一定量的数据,结构也比较简单。
容量(N)有时给小了不够用,给大了会有浪费,不好控制。
所以就提出了动态的顺序表。
静态顺序表的基本操作和动态差不多,这里重点描述动态顺序表,静态就不再赘述了。
动态顺序表使用动态开辟的数组存储元素
动态实现12345678typedef int ListData;typedef struct SeqList{ ListData* data; //数据内存 ...
基础理论DHCP是一种C/S模式的网络协议,要想实现DHCP功能,首先主机必须支持DHCP Client功能,其次网络中还必须拥有一台DHCP服务器,并且主机和该服务器之间必须能够正常通信。因为DHCP中有些报文时以广播的形式,因此DHCP Server和DHCP Client一般必须要在一个子网内。
DHCP服务器,既可以是一台主机,也可以是路由交换设备(华为和思科系列)用来实现DHCP服务器功能。
DACP协议采用UDP作为传输协议,客户端发送请求消息到DHCP服务器的67号端口,DHC服务器回应应答消息给客户端的68号端口。DHCP作为服务端负责集中给客户端分配各种网络地址参数(主要包括IP地址、子网掩码、广播地址、默认网关地址、DNS服务器地址)。
基础配置DHCP配置,默认DHCP配置文件(/etc/dhcp/dhcpd.conf)中什么配置都没有,里面的注释会告诉你在/usr/share/doc/dhcp/下有dhcp的配置模板。
我们把模板拷贝到DHCP配置文件下。
12[root@ ...
基础理论背景我们每天都要在网上访问大量的网站。浏览器上方有导航栏,在里面会有网站的域名以及文件路径。我们去访问一个网站只需要输入域名就可以访问,比如www.baidu.com,而在域名后面跟的是这个服务器下的文件路径,我们访问网站实际是在访问服务器。
现实中我们一般不是访问的一台物理服务器,而是一台虚拟的服务器,这一台虚拟服务器下面有许多的物理服务器作为它的支持,而文件则是存放在多台服务器上。这样可以提高网站的可靠性和安全性,即使有一台物理服务器宕机了我们的网站也不会因此受到影响。
计算机不能直接识别域名,计算机它只认IP地址。每个网站下的服务器都有一个IP地址用来通信。但是世界上的网站那么多,如果我们没有域名全靠输入IP地址去访问,我们哪能记住那么多的网站。于是我们为了方便我们记忆和使用,创造了DNS。
实现DNS 是 Domain Name System 的缩写,即域名系统。DNS做的工作是把IP和域名的映射关系存起来。当我们去解析域名的时候DNS服务器会告诉我们这个域名对应的IP是什么。当然也有反向的域名解析,把IP解析为域名。
在整个互联网世界中,域名的数量相当庞大。靠一台域名 ...
Golang
未读API接口接口是前后端通信的一套规范。
RESTful API一文搞懂RESTful API - bigsai - 博客园
URL设计规范URL为统一资源定位器 ,接口属于服务端资源,首先要通过URL这个定位到资源才能去访问,而通常一个完整的URL组成由以下几个部分构成:
1URI = scheme "://" host ":" port "/" path [ "?" query ][ "#" fragment ]
scheme: 指底层用的协议,如http、https、ftphost: 服务器的IP地址或者域名port: 端口,http默认为80端口path: 访问资源的路径,就是各种web 框架中定义的route路由query: 查询字符串,为发送给服务器的参数,在这里更多发送数据分页、排序等参数。fragment: 锚点,定位到页面的资源
我们在设计API时URL的path是需要认真考虑的,而RESTful对path的设计做了一些规范,通常一个RESTful API的path ...
Iptables简介 Netfilter/Iptables 是一个包过滤防火墙系统。Netfilter 是 Linux 内核的一个子系统,采用模块化设计,具有良好的可扩充性。Iptables 工具模块能让用户通过它去调用 Netfilter 内核,并允许使用者对数据报进行过滤、地址转换、处理等操作。Iptables 是有状态防火墙。
有状态防火墙和无状态防火墙有状态防火墙 有状态防火墙会检查数据包中的所有内容、数据特征以及数据的通信通道,还会检查数据包的行为,如果发现任何异常,可以过滤掉可疑数据。此外,有状态防火墙可以跟踪数据的行为方式,对行为模式进行编录。
无状态防火墙 无状态防火墙利用数据包的来源、目的地和其他参数来查明数据是否会构成威胁。这些参数必须由管理员或制造商通过他们事先设置的规则输入。
Netfilter/Iptables的状态信息 netfilter/iptables 有四种有效状态分别为: established(建立)、invalid(无效)、new(新)、related(相关的)。
establishe ...
计算机网络技术
未读L2TP VPN锐捷官方理论笔记概述 L2TP是对Point-to-Point Protocol(PPP)的一种扩展,它依靠利用PPP实现用户身份验证和传输数据。与PPTP不用的是,L2TP使用UDP作为控制消息与数据消息的传输协议。
L2TP也是实现VPN的一种重要和有效的方法。VPN使得网络用户访问公司内部网更方便与安全,无论是拨号用户还是其他网络接入方式的用户都可以通过VPN轻松到达这个目的。
锐捷支持两种模式的L2TP隧道: 本地客户端发起的L2TP通道。在这种情况下,路由器充当L2TP客户端并主动发起协商与远程L2TP服务器建立隧道。
远程客户端发起的L2TP通道。在这种情况下,路由器接受来自远程L2TP客户端的连接请求并协商建立隧道。
本地客户端发起模式和远程客户端发起模式,这其实就是客户端和服务器的关系。本地客户端发起模式负责发起L2TP会话并配置会话的一些参数,远程客户端发起模式负责接受L2TP会话并配置会话的一些参数。
本地客户端发起创建并配置L2TP-class接口(可选);
创建并配置Pseudowire-class接 ...
Linux
未读前置[源码软件包](Happlelaoganma | nginx)
1sudo apt-get install -y libssl-dev libpcre3 libpcre3-dev
openresty Makefile生成脚本: make.sh12345678910111213141516171819202122232425262728293031#!/bin/bash./configure \--prefix=/etc/openresty \--add-module=/opt/ngx_http_proxy_connect_module \--with-luajit \--with-pcre-jit \--with-stream \--with-stream_ssl_module \--with-http_ssl_module \--with-http_auth_request_module \--with-http_v2_module \--with-http_v3_module \--without-mail_pop3_module \--without-mail_imap_m ...
STL
未读STL-list链表实现STL中采用双向带头循环链表来实现 list,下面将使用 C++ 实现 STL list 链表。
list 类中包含两个主要部分,一个是指向哨兵位头节点的指针(_head),另一个是结构体类型的迭代器(__list_iterator)。
哨兵位头节点本身是不存储数据的,它只是用于简化代码实现操作的,让 list 的头插尾插更加的方便。在 list 中通过指向哨兵位头节点的指针(_head)用于链接节点,实现高效快速地访问头(_next)和尾(_prev)。
在 string 和 vector 中我们可以通过指针++访问下一个元素,这是因为它们俩都是顺序存储是一片连续不断的内存空间,自然地可以实现指针++访问下一个元素。所以它们俩的迭代器基本就是原生指针套了一个壳子叫 iterator 以配合STL的统一设计。
但是如果想实现遍历 list 容器,单靠指针++访问下一个元素是实现不了的,因为链表很灵活,每个节点的内存空间并不一定连续,所以不能单靠指针++访问下一个元素是做不到的。但是为了实现迭代器++访问下一个元素我们得对 list 的迭代器进行特殊的封装,以实 ...
stack栈和queue队列在STL中 stack 和 queue 设计为容器适配器,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一组特定的成员函数来访问其元素。
在我的STL系列中之前的容器 vector、list、deque 都是从底层类型一步步封装而来的,但是 stack 和 queue 没有这样,而是直接使用现有的容器并加以封装去实现功能。
12template <class T, class Container = deque<T> > class stack;template <class T, class Container = deque<T> > class queue;
这是 stack 和 queue 的类模板,可以看到它们都有一个类模板参数且缺省值都为 deque<T>,在 stack 和 queue 容器适配器中默认使用 deque 容器进行封装。为什么是封装的 deque 不是 vector 或者 list 我们得先了解 stack 和 queue 的结构和功能才能理解。
stac ...
vector 与 stringSTL中 vector 是顺序表的实现。vector 和 string 十分相似,但功能各不相同。
string 是 C++ STL 中用于存储字符序列的容器,它提供了大量用于操作字符串的方法,但是它的底层其实就是封装的一个 char* 的指针,并增加需多方法,专门用于处理文本数据。
123456789class string{public: typedef char* iterator;private: char* _str; size_t _capacity; size_t _size;};
我们都知道字符串的内存空间是连续的,这一点 vector 也一样。vector 是 C++ STL 中的动态数组容器,vector 的底层是一个 T* 的指针,用于顺序地储存任意类型,适用于需要频繁访问和修改元素的场景。
12345678910111213141516171819202122232425262728template<class T>class vector{public: // Vect ...