当前位置: 首页 > news >正文

C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)

目录

前言

一、网络的含义与构成

含义:

构成: 

二、网络的体系结构

1>OSI七层模型

2>TCP/IP协议体系结构 

3>数据经过体系结构,怎么封装? 

4>端口号

5>大小端序

6>TCP/UDP传输层的协议 

三、系统函数API学习框架(TCP)    

服务器(优先):

 客户端:

四、服务器和客户端代码实例 

总结


前言

网络编程是指使用编程语言进行网络通信的过程。通过网络编程,计算机可以通过互联网或局域网与其他计算机进行数据交换和通信。在网络编程中,程序员需要使用特定的网络编程接口和协议(如TCP/IP、HTTP等)来实现数据的发送和接收。网络编程常用于开发网络应用、远程服务和分    布式系统等。

网络编程具有以下几个重要的作用:

  1. 数据交换和通信:通过网络编程,计算机可以在网络上进行数据的发送和接收,实现信息的交换和通信。这对于实现远程服务、分布式系统以及网络应用等都非常重要。

  2. 分布式系统:通过网络编程,可以将多台计算机连接起来,形成一个分布式系统。在分布式系统中,不同计算机之间可以互相通信和协作,共享资源和处理任务,从而提高系统的可靠性、性能和扩展性。

  3. 网络应用开发:网络编程是开发网络应用(如Web应用、聊天室、在线游戏等)的基础。通过网络编程,可以实现服务器端和客户端之间的数据交互,从而实现用户与服务器的交互和信息的展示。

  4. 网络安全:网络编程也与网络安全密切相关。通过网络编程,可以实现加密、认证、防止信息泄漏等安全机制,保护网络通信的隐私和安全。

总之,网络编程为计算机之间的数据交换和通信提供了技术基础,成为了构建分布式系统、开发网络应用以及保障网络安全的重要手段。


一、网络的含义与构成

含义:

   1.什么是网络?
        网络是信息传输、接收和共享的虚拟世界,通过把地球村内所有
信息汇聚起来,从而实现这些资源的共享。
        初衷:知识共享            

构成: 

 2.计算机上的软件层面的网络是由什么构成?
        1>IP
            格式:
                点分十进制        用户浏览与编写    192.168.10.x
                网络二进制        系统、电脑看的  0、1组合
            分类:
                IPv4   (主要集中,应用在电脑)
                    点分十进制        4个字节
                    网络二进制        32位
                (42个ip地址)
                IPv6  (手机WiFi、目前在电脑中不集中)
                    点分十进制        16个字节
                    网络二进制        128位


                IPv4分五类
                    A B C D E
                大型网 中大型 中小型 组播型 待用型

                 

                 

(1)A类地址
                    网络二进制:是以0开头
                    1个网络地址 3个主机地址(网络地址等于你在哪个教室,主机地址
                    代表你在教室中的位置)
网络二进制:
00000000 00000000 00000000 00000001 - 01111111 11111111 11111111 11111110 
点分十进制:
    0.0.0.1-127.255.255.254  
注意:
        主机位全为0,定义为网段号,网络ID号
        主机位全为1,定义广播地址
        

(2) B类地址
                    网络二进制:是以10开头
                    2个网络地址 2个主机地址(网络地址等于你在哪个教室,主机地址
                    代表你在教室中的位置)
网络二进制:
10000000 00000000 00000000 00000001 - 10111111 11111111 11111111 11111110 
点分十进制:
    128.0.0.1-191.255.255.254  
注意:
        主机位全为0,定义为网段号,网络ID号
        主机位全为1,定义广播地址

(3)C类地址
                    网络二进制:是以110开头
                    3个网络地址 1个主机地址(网络地址等于你在哪个教室,主机地址
                    代表你在教室中的位置)
网络二进制:
11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110 
点分十进制:
    192.0.0.1-223.255.255.254  
注意:
        主机位全为0,定义为网段号,网络ID号
        主机位全为1,定义广播地址

(4)D类地址
                    网络二进制:是以1110开头
                    4个网络地址 0个主机地址(网络地址等于你在哪个教室,主机地址
                    代表你在教室中的位置)
网络二进制:
11100000 00000000 00000000 00000001 - 11101111 11111111 11111111 11111110 
点分十进制:
    224.0.0.1-239.255.255.254    
注意:
        主机位全为0,定义为网段号,网络ID号
        主机位全为1,定义广播地址            
        
(5)E类地址
                    未来可期

        2>子网掩码
            网络地址全为1,主机全为0
            255.255.255.0
            用来判断是否在同一网段
            前缀长度:24(主要看子网掩码中1的个数)
            -->在linux网络配置中有体现
            
        3>默认网关
            主机地址默认值为1,随机取1-254,掐头去尾
            用来管理当前网段下的信息传输;网络的门户
            -->结合图片理解
            
        4>DNS域名解析服务器
            按照地方运营商提供的DNS域名服务器
            202.98.128.86
            www.baidu.com
            IP所属地:广东、深圳

二、网络的体系结构

1.OSI七层模型

 ISO公司推出的网络体系模型
        
        协议:双方规定好的通信规则
            应用层
            表示层
            会话层
            传输层
            网络层
            数据链路层
            物理层
        
        目的:将数据封装起来,形成一个约定好的通信协议
        缺点:太复杂,太繁琐,有写功能重复

2.TCP/IP协议体系结构 

        应用层        ftp、http、ping、ssh        
        传输层        TCP、UDP
        网络层        IP、ICMP、IGMP
        物理层        网线
        
        重点学习的网络体系结构,网络协议中的世界

3.数据经过体系结构,怎么封装? 

 封装数据的目的是为了保证数据在网络中传输的稳定性
            -->结合图片理解

4.端口号

 区分不同的应用程序,针对主机
            QQ4999,微信5050
            2个字节 0~65535
            0~1023  --》系统进程使用的
            1024~65535  --》用户用的 

5.大小端序

 不同类型的CPU的主机中,内存存储的整数字节序有两种
            小端序:
                低位字节存储到低位地址,     linux
            大端序: 
                低位字节存储到高位地址,     系统

6.TCP/UDP传输层的协议 

    TCP/UDP的区别:
        UDP(用户数据报协议)的特点:只管发送,没有连接属性,数据因此不可靠,不稳定,易丢失。
        举例:写信
        
        TCP(传输控制协议)的特点:要先建立连接,保证了数据的可靠信,因此数据稳定,不丢包。
        举例:带电话

三、系统函数API学习框架(TCP)    

服务器(优先):

     框架:             
                1>创建socket套接字
                2>绑定自己的IP地址和端口号
                3>监听
                4>等待客户端连接
                5>数据收/发
                6>关闭套接字(具有网路属性的文件描述符) 

1.创建socket套接字 (socket

   头文件:

    #include<sys/types.h>
    #include<sys/socket.h>
    int socket(int domain, int type, int protocol);
    功能:
        创建一个具有网络属性的文件描述符
    参数:
        domain:协议族
            AF_UNIX,AF_LOCAL          本地连接
            AF_INET                   IPv4
            AF_INET6                   IPv6
        type:
        SOCK_STREAM    流式套接字       TCP
        SOCK_DGRAM  数据报套接字   UDP
        SOCK_RAW    原始套接字
        protocol:
            默认为0,表示前面两个所选参数生效
    返回值:
        成功返回具有网络属性的文件描述符
        失败,返回-1并设置错误码
        
    socket位于哪里,位于应用层和传输层之间

 2.绑定自己的IP地址和端口号(bind

    头文件:

    #include<sys/types.h>
    #include<sys/socket.h>
    int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
    功能:
        将IP地址和端口号绑定在sockfd上,难点在于第二参结构体赋值
    参数:
        sockfd:这个是socket创建出来的具有网络属性的文件描述符
        my_addr:结构体指针,用来赋值IP地址和端口号
        addrlen:结构体的长度
    返回值:
        成功返回0
        失败,返回-1并设置错误码
    
    第二参数const struct sockaddr *my_addr
    
    struct sockaddr {
       sa_family_t sa_family;  2个字节
       char        sa_data[14]; 14个字节
    }
    
    问题:
        赋值时IP地址和端口号哪个在前哪个在后不确定
        IP地址和端口号只占据6个字节,还有8个字节怎么填充
        
    因此选用同族结构体
    struct sockaddr_in{
        sa_family_t   sin_family;   //地址族
        uint16_t      sin_port;     //端口号 
        struct in_addr    sin_addr;  //32位IP地址
        char     sin_zero[8];      //预留未使用,自动填充0
    };
    struct in_addr{
        In_addr_t  s_addr;    //32位IPv4地址
    };

    1>注意端口大小端序转换的问题
    #include <arpa/inet.h>
    
    uint32_t htonl(uint32_t hostlong);  32位
    uint16_t htons(uint16_t hostshort); 16位
    以上小端序转大端序
    
    uint32_t ntohl(uint32_t netlong);
    uint16_t ntohs(uint16_t netshort);
    大端序转回小端序

    2>注意IP格式转换
    #include <netinet/in.h>
    in_addr_t inet_addr(const char *cp);
    将点分十进制的IP地址转换为网络二进制
    
    char *inet_ntoa(struct in_addr in);
    将网络二进制转回点分十进制

3.监听 (listen

    头文件:
    #include <sys/types.h>
    #include <sys/socket.h>
    int listen(int sockfd, int backlog);
    功能:
        保护服务器,限制同一瞬间最大的客户端连接数量
    参数:
        sockfd:这个是socket创建出来的具有网络属性的文件描述符
        backlog:最大的客户端连接数量
    返回值:
        成功返回0
        失败,返回-1并设置错误码

4.等待客户端连接 (等待意味着“阻塞” accept)

   头文件:

    #include <sys/types.h>
    #include <sys/socket.h>
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    功能:
        等待客户端连接,第二参能保存对方的IP地址和端口号,不需要保存对方设置NULL
    参数:
        sockfd:这个是socket创建出来的具有网络属性的文件描述符
        addr:用来保存客户端信息的结构体
        addrlen:结构体长度。
    返回值:
        成功返回与客户端通信的文件描述符,与socket函数类似
        失败,返回-1并设置错误码

 客户端:

为了演示效果明显,我们开始写客户端框架

        1>创建socket套接字
        2>声明服务器所在的IP地址和端口号
        3>主动连接服务器
        4>数据收/发
        5>关闭文件描述符

1.创建socket套接字与服务器相似

2.声明服务器所在的IP地址和端口号

        struct sockaddr_in server;
        server.sin_family = AF_INET;
        server.sin_port = htons(8888);
        server.sin_addr.s_addr = inet_addr("192.168.10.5");
        注意声明都是别人的,与你无关

3.主动连接服务器 (connect

    头文件:

    #include <sys/types.h>
    #include <sys/socket.h>
    int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
    功能:
        主动连接服务器,第二参能保存对方的IP地址和端口号,不需要设置NULL
    参数:
        sockfd:这个是socket创建出来的具有网络属性的文件描述符
        addr:用来连接服务器的结构体
        addrlen:结构体长度,一般用sizeof()。
    返回值:
        成功返回0
        失败,返回-1并设置错误码

 4.数据发送(send

    头文件:

    #include <sys/types.h>
    #include <sys/socket.h>
 
    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    功能:
        数据发送
    参数:
        sockfd:套接字文件描述符
        buf:发送缓冲区
        len:发送缓冲区长度
        flags:默认为0,表示阻塞
    返回值:
    成功:返回发送的字节数
    失败:返回-1,并设置errno

 5.数据接收(recv

   头文件:

    #include <sys/types.h>
    #include <sys/socket.h>
    ssize_t recv(int sockfd,void *buf, size_t len, int flags);
    功能:
        数据接收
    参数:
        sockfd:套接字文件描述符
        buf:接收缓冲区
        len:接收缓冲区长度
        flags:默认为0,表示阻塞
    返回值:
    >0: 返回接收的字节数
    =0:    客户端异常退出(CTRL+C)
    <0: 失败:返回-1,并设置errno 

四、服务器和客户端代码实例 

//服务器代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int main(void)
{//1>创建socket套接字int serfd = socket(AF_INET,SOCK_STREAM,0);//1.选IPv4,2选TCP,3默认0if(serfd<0)	//错误判断{perror("socket");return -1;}printf("创建出的socket的值为%d\n",serfd);//2>绑定自己的IP地址和端口号struct sockaddr_in my_addr;my_addr.sin_family = AF_INET;//IPv4my_addr.sin_port = htons(8888);//将linux小端转系统的大端my_addr.sin_addr.s_addr =inet_addr("192.168.10.5");//注意将IP地址格式转为网络二进制,还有记得改成自己的linuxIP地址int ret;ret = bind(serfd,(struct sockaddr *)&my_addr,sizeof(my_addr));//第二参将同族结构体强转为函数需要的结构体类型if(ret<0)	//错误判断{perror("bind");return -1;}printf("serfd网络属性已成功配置!\n");//3>监听ret = listen(serfd,8);if(ret<0)	//错误判断{perror("listen");return -1;}printf("监听已启动,保护服务器中^-^\n");//4>等待客户端连接 阻塞int clifd = accept(serfd,NULL,NULL);//accept接触阻塞后将产生一个与客户端通信的文件描述符if(clifd<0)	//错误判断{perror("accept");return -1;}printf("创建出与客户端通信的文件描述符值为%d\n",clifd);printf("有客户连接进来了!\n");//5>数据的接收char buf[30];while(1){
#if 0bzero(buf,sizeof(buf));ret = recv(clifd,buf,sizeof(buf),0);//阻塞printf("客户端说:%s\n",buf);
#endifbzero(buf,sizeof(buf));ret = recv(clifd,buf,sizeof(buf),0);//阻塞if(ret<0){perror("recv");return -1;}else if(ret == 0){printf("客户带着小姨子跑了!\n");return -1;}else{printf("客户端说:%s\n",buf);}}//6>关闭套接字close(serfd);close(clifd);return 0;
}
//客户端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int main(void)
{//1>创建socket套接字int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket");return -1;}printf("创建出的socket的值为%d\n",sockfd);//2>声明"服务器"所在的IP地址和端口号struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(8888);server.sin_addr.s_addr = inet_addr("192.168.10.5");printf("已经声明服务器的IP地址和端口号!\n");//3>主动连接服务器int ret = connect(sockfd,(struct sockaddr*)&server,sizeof(server));if(ret<0){perror("connect");return -1;}printf("连接服务器成功,请进行操作!\n");//4>数据发送char buf[30];while(1){bzero(buf,sizeof(buf));scanf("%s",buf);send(sockfd,buf,strlen(buf),0);	}//5>关闭文件描述符close(sockfd);return 0;
}


总结

        本篇文章针对C/C++ 网络编程进行详细讲解,希望能够帮到大家!

        以后还会给大家展现更多关于嵌入式和C语言的其他重要的基础知识,感谢大家支持懒大王!

       希望这篇博客能给各位朋友们带来帮助,最后懒大王请来过的朋友们留下你们宝贵的三连以及关注,感谢你们!  

相关文章:

C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)

目录 前言 一、网络的含义与构成 含义&#xff1a; 构成&#xff1a; 二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构 3>数据经过体系结构&#xff0c;怎么封装? 4>端口号 5>大小端序 6>TCP/UDP传输层的协议 三、系统函数API学习框…...

chrome Driver 使用教程

ChromeDriver是一款实用的chrome浏览器驱动工具,能够用于自动化测试、网络爬虫和操作浏览器,其主要作用是模拟浏览器操作。 ## 下载地址 [Chrome for Testing availability]&#xff08;Chrome for Testing availability&#xff09;...

目标检测YOLO实战应用案例100讲-面向恶劣环境下的多模态 行人识别

目录 前言 国内外研究现状 可见光行人目标识别 红外行人目标识别...

react-router-dom v6版本实现Tabs路由缓存切换

目录 文章目录 概要 效果 完整代码 概要 摆了半年摊&#xff0c;好久没写代码了&#xff0c;今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大&#xff0c;但了解react的机制和rea…...

ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?

本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件&#xff0c;拖到ArcGIS后却出现“未知的空间参考&#xff1a;添加的数据源缺少空间参考信息 不能投影”的提示&#xff0c;如下图所示&#xff1a; 这种情况就…...

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎&#xff0c;它还提供了分布式的多用户能力&#xff0c;实时的分析&#xff0c;以及对复杂搜索语句的处理能力&#xff0c;使其在众多场景下&#xff0c;如企业搜索&#xff0c;日志和事件数据分析等…...

离线语音与IoT结合:智能家居发展新增长点

离线语音控制和物联网&#xff08;IoT&#xff09;相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理&#xff0c;而不需要依赖云服务器进行处理。IoT是指借助网络&#xff0c;通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…...

STM32MP135和STM32MP157的区别

本文介绍了STMicroelectronics公司推出的两款多核处理器STM32MP135和STM32MP157之间的区别&#xff0c;包括主频、集成硬件模块数量、内存大小和电压调节模块等方面。 STMicroelectronics是一家领先的半导体解决方案提供商&#xff0c;在嵌入式系统领域有着丰富的经验。他们…...

微信小程序文本横向无缝滚动

背景&#xff1a; 微信小程序中列表宽度不够长&#xff0c;其中某字段显示不完整&#xff0c;因此要使其自动滚动。 &#xff08;最初看网上很多用定时器实现&#xff0c;但他们的案例中都只是一个横幅、用定时器也无所谓。但是我的需求中是一个上下无限滚动的列表&#xff0c;…...

Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值

var iframeWindow window[layui-layer-iframe index]; iframeWindow.layui.tree............(这里就可以操作tree里面的内容了)。var chrild layero.find(iframe).contents(); chrild.layui.tree (这样是调用不到的)。var child layer.getChildFrame(); child.layui.tree(这…...

镜头边缘的解析力通常比中心差很多的原因是什么?

1、问题背景 之前有总结过一篇文章&#xff0c;“ 相机出图画面一半清晰&#xff0c;一半模糊的原因是什么&#xff1f;”里面有描述到关于镜头边缘的清晰度通常比中心要差的原因主要是光的折射导致的&#xff0c;有读者指出问题&#xff0c;折射率是和传输介质相关&#xff0…...

“控制情绪,理性交流”刍议

今天&#xff0c;本“人民体验官”还是回避推广人民日报官方微博文化产品《走出低谷期的9个习惯》。 截图&#xff1a;来源“人民体验官”推广平台 ​之前&#xff0c;由于笔者读过《人民日报》曾经发表过的关于“学会管理情绪 ”的文章&#xff0c;对文章中这些观点深表认同&…...

UI基础之插画分类优漫动游

一、UI插画分类 UI基础之插画分类   1.扁平插画   优点∶快速上手&#xff0c;同时画风简洁明了&#xff0c;突出重   点&#xff0c;能够快速的让用户了解内容   缺点:过于简洁&#xff0c;运用的也比较普遍&#xff0c;视觉上难以让用户记住   2.肌理插…...

Vue 3.0中Treeshaking特性是什么?

一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除无用的代码 如果把代码打包比作制作蛋糕&#xff0c;传统的方式是把鸡…...

SQL union all的使用

背景&#xff1a; 公司业务开发需要将两个取出两个相同表结构&#xff08;原料、辅料&#xff09;的数据&#xff0c;组成一个新视图&#xff0c;使用了UNION ALL SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GOCREATE view vw_rawmaterial_ny_list as ( select id,ccode,cc…...

docker 安装 Centos7

1. 从docker 安装 Centos7 查看有哪些 centos7 系统&#xff1a;docker search centos72. 安装 centos7 docker pull docker.io/ansible/centos7-ansible3.使用镜像创建容器 docker run -itd -p 8022:22 --namevm01 -v /bodata:/bodata -h vm01 --privilegedtrue 688353a31…...

Kubernetes技术与架构-Ingress

Ingress是一个流量网关&#xff0c;其根据配置的URI路径路由规则&#xff0c;为运行在Kubernetes集群中的Service分发流量&#xff0c;从系统架构设计的角度看&#xff0c;Ingress位于Service的上层&#xff0c;本文主要描述Ingress的基本使用方式。 如上所示&#xff0c;clien…...

基于Java的文物管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

uniapp图片加水印

1、uniapp加水印 1.1、创建画布容器 <canvas class"watermark-canvas" id"watermark-canvas" canvas-id"watermark-canvas":style"{ width: canvasWidth, height: canvasHeight }" /> 1.2、获取水印内容 async getLocation(…...

react中JSX基础与useState的基本使用 + 评论显示删除需求案例

参考视频&#xff1a;https://www.bilibili.com/video/BV1ZB4y1Z7o8/?p3&spm_id_frompageDriver&vd_source5c584bd3b474d579d0bbbffdf0437c70 如果没有安装create-react-app需要先全局安装 命令&#xff1a;npm i -g create-react-app1.快速搭建开发环境 create-re…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...