嵌入式学习——网络编程(UDP)——day30

1. 协议

        通信双方约定的一套标准成为协议

2. 国际网络协议标准

2.1 OSI七层模型(理论模型)

            应用层:传输的数据(a.out)
            表示层:数据是否加密
            会话层:是否需要建立会话链接(网络断开连接状态)
            传输层:传输数据的方式(TCP、UDP)
            网络层:数据路由(IP地址)
            数据链路层:局域网内的数据传输(交换机局域网内多设备的链接)
            物理层:物理介质链接(网线、电缆  硬件高低电平)

2.2 TCP/IP网络协议模型(实际开发)

            应用层
            传输层
            网络层
            网络接口层(链路+物理)

        1. 应用层协议

                FTP  TFTP  HTTP  SMTP  TELNET 

        2. 传输层协议——UDP、TCP

              UDP:用户数据报协议(无连接)
                    特点:
                    1.不安全、不可靠
                    2.数据量小
                    3.占用资源开销小
              TCP:传输控制协议(有链接)
                    特点:
                    1.安全、可靠
                    2.数据量大
                    3.占用资源开销大

                三次握手建立链接
                数据传输过程中双方通过序列号和确认号保障数据传输完整性
                四次挥手结束链接

        3. 网络层协议——局域网

        3.1 IPv4

        (1)IP:192.168.0.189    ——   网络位(192.198.0)    主机位(189)

                IP地址 = 网络位 + 主机位

                    网络位:IP地址所在的网段    

                    主机位:在局域网内的主机编号

        (2)子网掩码:搭配IP地址使用,区分IP地址中的网络位和主机位

                                   子网掩码是1的部分对应IP地址网络位

                                   子网掩码是0的部分对应IP地址主机位

        (3)网段号:网络位不变,主机位全为0的IP地址——192.168.0.0

                 广播号:网络位不变,主机位全为1的IP地址——192.168.0.255

                        (给广播号发送一个信息,所有的IP地址都能搜到)

        (4)IP地址的分类

                A类:1.0.0.0 - 126.255.255.255
                    子网掩码:255.0.0.0
                    管理大规模网络
                    私有IP:10.0.0.0 - 10.255.255.255
        
                B类:128.0.0.0 - 191.255.255.255
                    子网掩码:255.255.0.0 
                    管理大中规模网络
                    私有IP:172.16.0.0 - 172.31.255.255 
        
                C类:192.0.0.0 - 223.255.255.255
                    子网掩码:255.255.255.0 
                    管理中小规模网络
                    私有IP:192.168.0.0 - 192.168.255.255 
        
                D类:224.0.0.0 - 239.255.255.255
                    用于组播传输(给一组人传输数据)
        
                E类:240.0.0.0 - 255.255.255.254 
                    用于科研实验

                公有IP地址:能够直接上网的IP地址(路由器)
                私有IP地址:不能直接上网的IP地址(个人主机)

        (5)MAC地址:网卡地址  物理地址(此地址不会重复,是唯一的)

        (6)端口号:唯一识别同一主机不同进程的号码

                (0 - 65535)(不要使用10000以内的,10000以内的是系统的)

        (7)注意

                  IP地址是为了找某一个网段、MAC地址是为了找在局域网中找到某一个主机

4. UDP编程——不论对方是否收到都能完成发送

4.1 socket

      int socket(int domain, int type, int protocol);
      功能:
        创建一个用来进程通信的套接字,返回文件描述符
      参数:
        domain:AF_INET           IPv4协议族
        type:SOCK_STREAM    流式套接字            tcp传输协议
             SOCK_DGRAM    数据报套接字            udp传输协议
             SOCK_RAW        原始套接字            
        protocol:
            默认为0 
      返回值:
        成功返回套接字新文件描述符
        失败返回-1 

4.2 sendto

      ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
      功能:
        给另一个套接字发送消息
      参数:
        sockfd:套接字文件描述符
        buf:要发送数据存放空间的首地址
        len:要发送数据的长度
        flags:发送属性  默认为0 
        dest_addr:目的地址
        addrlen:目的地址信息长度
      返回值:
        成功返回发送字节个数
        失败返回-1 
    
    struct sockaddr_in {
       sa_family_t    sin_family; /* address family: AF_INET */(协议族)
       in_port_t      sin_port;   /* port in network byte order */(端口号、小端存储要改成大端存储)
       struct in_addr sin_addr;   /* internet address */(IP地址)
   };

   /* Internet address. */
   struct in_addr {
       uint32_t       s_addr;     /* address in network byte order */
   };

4.3 inet_addr

      in_addr_t inet_addr(const char *cp);
      功能:
        将字符串IP地址转换为二进制IP地址 
      参数:
        cp:字符串IP地址空间首地址
      返回值:
        成功返回二进制IP地址

4.4 htons

      uint16_t htons(uint16_t hostshort);
      功能:
        将本地字节序(小端)转换为网络字节序(大端)
      参数:
        hostshort:本地端口号
      返回值:
        返回网络字节序端口号
        
      uint16_t ntohs(uint16_t netshort);
      功能:
        将网络字节序(大端)转换为本地字节序(小端)

4.5 bind

      int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
      功能:
        将套接字与IP地址端口绑定在一起
      参数:
        sockfd:文件描述符 
        addr:结构体空间首地址 
        addrlen:信息的长度
      返回值:
        成功返回0 
        失败返回-1 

4.6 recvfrom

      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
      功能:
        接收数据
      参数:
        sockfd:套接字文件描述符
        buf:存放接收到数据空间的首地址
        len:最多允许接收的字节数
        flags:属性 默认为0 
        src_addr:存放发送端地址信息空间首地址
        addrlen:想要接收发送端地址大小的变量空间首地址
      返回值:
        成功返回实际接收字节数
        失败返回-1 
        
    注意:
        该函数具有阻塞功能

4.7 UDP编程示例代

(1)单方向收发

        1.  头文件

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>#endif

              2  发送端代码(send.c)

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;char tmpbuff[1024] = {"hello world"};struct sockaddr_in recvaddr;ssize_t nsize = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.0.155");nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff)+1, 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == nsize){perror("fail to sendto");return -1;}printf("send %ld bytes success\n", nsize);close(sockfd);return 0;
}

                3. 接收端代码(recv.c)

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;int ret = 0;ssize_t nsize = 0;char tmpbuff[4096] = {0};struct sockaddr_in recvaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.0.155");ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == ret){perror("fail to bind");return -1;}nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, NULL, NULL);if (-1 == nsize){perror("fail to recvfrom");return -1;}printf("recv %ld bytes success\n", nsize);printf("RECV:%s\n", tmpbuff);close(sockfd);return 0;
}

 (2)双向通信

        1. 头文件

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>#endif

        2. 发送端

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;char tmpbuff[4096] = {"你在吗?"};struct sockaddr_in recvaddr;ssize_t nsize = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}	recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.0.155");nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff)+1, 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == nsize){perror("fail to sendto");return -1;}memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, NULL, NULL);if (-1 == nsize){perror("fail to recvfrom");return -1;}printf("RECV:%s\n", tmpbuff);close(sockfd);return 0;
}

        3. 接收端

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;int ret = 0;struct sockaddr_in recvaddr;struct sockaddr_in sendaddr;char tmpbuff[4096] = {0};ssize_t nsize = 0;socklen_t addrlen = sizeof(sendaddr);sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}	recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.0.155");ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == ret){perror("fail to bind");return -1;}nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, (struct sockaddr *)&sendaddr, &addrlen);if (-1 == nsize){perror("fail to recvfrom");return -1;}printf("[%s:%d]%s\n", inet_ntoa(sendaddr.sin_addr), ntohs(sendaddr.sin_port), tmpbuff);sprintf(tmpbuff, "%s --------echo", tmpbuff);nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&sendaddr, sizeof(sendaddr));if (-1 == nsize){perror("fail to sendto");return -1;}close(sockfd);return 0;
}

(3)使用UDP进行文件复制(cp)

        1. 服务端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser,cli;//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port  = htons(50000);//host to net  short ser.sin_addr.s_addr = INADDR_ANY ;//inet_addr("127.0.0.1")int ret = bind(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}int fd = open("2.png",O_CREAT|O_WRONLY|O_TRUNC,0666);if(-1 == fd){perror("open");exit(1);}while(1){char buf[1024]={0};socklen_t len = sizeof(cli);int rd_ret = recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);if(0 == strcmp(buf,"^_^")){break;}write(fd,buf,rd_ret);bzero(buf,sizeof(buf));strcpy(buf,"go on");sendto(sockfd,buf,strlen(buf),0,(SA)&cli,sizeof(cli));}close(fd);close(sockfd);return 0;
}

        2. 客户端

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser,cli;//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port  = htons(50000);//host to net  short ser.sin_addr.s_addr = inet_addr("192.168.203.128");int fd = open("/home/linux/1.png",O_RDONLY);if(-1 == fd){perror("open");exit(1);}char buf[1024]={0};socklen_t len = sizeof(ser);while(1){bzero(buf,sizeof(buf));int rd_ret = read(fd,buf,sizeof(buf));if(rd_ret<=0){break;}sendto(sockfd,buf,rd_ret,0,(SA)&ser,len);bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);}strcpy(buf,"^_^");sendto(sockfd,buf,strlen(buf),0,(SA)&ser,len);close(fd);close(sockfd);return 0;
}

                

(4) 使用UDP进行两端聊天(chat)

        1. 服务端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <pthread.h>
typedef struct sockaddr * (SA);struct sockaddr_in ser,cli;
void* th1(void* arg)
{int sockfd =* (int*)arg;while(1){char buf[256]={0};socklen_t len = sizeof(cli);recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);printf("from c:%s\n",buf);}}
void* th2(void* arg)
{int sockfd =* (int*)arg;while(1){printf("to c:");char buf[256]={0};fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';sendto(sockfd,buf,strlen(buf),0,(SA)&cli,sizeof(cli));}}
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port  = htons(50000);//host to net  short ser.sin_addr.s_addr = inet_addr("127.0.0.1");int ret = bind(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}pthread_t tid1,tid2;socklen_t len = sizeof(cli);char buf[256]={0};recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);pthread_create(&tid1,NULL,th1,&sockfd);pthread_create(&tid2,NULL,th2,&sockfd);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

        2. 客户端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>typedef struct sockaddr * (SA);struct sockaddr_in ser,cli;
void* th1(void* arg)
{int sockfd =* (int*)arg;while(1){char buf[256]={0};socklen_t len = sizeof(cli);recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);printf("from s:%s\n",buf);}}
void* th2(void* arg)
{int sockfd =* (int*)arg;while(1){printf("to s");char buf[256]={0};fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';sendto(sockfd,buf,strlen(buf),0,(SA)&ser,sizeof(ser));}}
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port  = htons(50000);//host to net  short ser.sin_addr.s_addr = inet_addr("127.0.0.1"); pthread_t tid1,tid2;char buf[256]="start";sendto(sockfd,buf,strlen(buf),0,(SA)&ser,sizeof(ser));pthread_create(&tid1,NULL,th1,&sockfd);pthread_create(&tid2,NULL,th2,&sockfd);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

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

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

相关文章

shell 变量引用 ${}、$,传参 $1、$2,四则运算 $[]

变量引用 两种&#xff1a; ${变量名} $变量名 例如&#xff1a; filepath"/home/mytool" filename"t1.txt" 可以写成 echo "$filepath/$filename" 或者 echo "${filepath}/${filename}"打印结果&#xff1a; /home/mytool/t1.tx…

[力扣题解] 617. 合并二叉树

题目&#xff1a;617. 合并二叉树 思路 递归法遍历&#xff0c;随便一种遍历方式都可以&#xff0c;以前序遍历为例&#xff1b; 代码 class Solution { public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 NULL){return root2;}if(root2 NULL){r…

Java面试题:Redis数据过期策略

Redis数据过期策略 数据过期之后对数据进行删除的处理 惰性删除 每次需要该key时对key进行检查 如果过期就删除,反之就返回该key 对cpu友好,不用浪费时间进行过期检查 对内存不友好,如果key过期但没使用就会一直存在内存中不会释放 定期删除 每隔一段时间对一些key进行…

Linux软件安装以及网络请求和下载

目录 前言一、系统环境二、软件安装2.1 使用yum命令实现软件的自动化安装 三、网络请求和下载3.1 wget命令3.2 curl命令 总结 前言 本篇文章介绍如何在Linux系统上安装软件&#xff0c;以及如何发送网络请求并从网络下载文件。 一、系统环境 虚拟机版本&#xff1a;VMware W…

气膜乒乓球馆:新型体育设施的投资机遇—轻空间

乒乓球作为我国的国球&#xff0c;不仅在世界舞台上表现卓越&#xff0c;在国民的心目中也占有重要位置。随着科技的进步&#xff0c;气膜乒乓球馆作为一种新型体育设施&#xff0c;正逐渐走入大众视野&#xff0c;为乒乓球爱好者提供了一个舒适、安全、环保的运动场所。那么&a…

linux的编辑安装

yum remove 软件名 注意&#xff1a;yum安装自动解决各种依赖&#xff0c;安装位置固定不可改 编辑安装 安装源码包的过程&#xff1a; 1.解压源码包 2.进入解压目录 3.安装依赖 4.执行./configure 1)检查当前系统环境是否满足后续操作 2)指定软件…

Linux环境---在线安装MYSQL数据库

Linux环境—在线安装MYSQL数据库 一、使用步骤 1.安装环境 Mysql 驱动 8.0 需要 jdk1.8 才行。 JDK版本&#xff1a;1.8 参考文档 MYSQL版本&#xff1a;8.0.2 下载链接: https://pan.baidu.com/s/1MwXIilSL6EY3OuS7WtpySA?pwdg263 操作系统&#xff1a;CentOS 1.1 建立存…

【论文阅读】MODELING AND SOLVING THE TRAVELING SALESMAN PROBLEM WITH PRIORITY PRIZES

文章目录 论文基本信息摘要1.引言2. INTEGER QUADRATIC PROGRAM FOR TSPPP3. MIXED INTEGER LINEAR PROGRAMS FOR TSPPP4. TABU SEARCH ALGORITHM FOR TSPPP5. COMPUTATIONAL RESULTS6. CONCLUDING REMARKS补充 论文基本信息 《MODELING AND SOLVING THE TRAVELING SALESMAN P…

hadoop部署hive

1.安装mysql数据库 这里采用docker部署mysql,如果没有安装docker #安装yum工具 yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken #设置docker镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/…

搜索引擎优化服务如何寻找?

首先你要了解搜索引擎优化&#xff0c;也就是seo具体是什么&#xff0c;要做些什么&#xff0c;然后就是确定你自身业务的需求&#xff0c;是要特定的关键词排名&#xff0c;还是整体网站流量的提升&#xff0c;还是想要优化目前的网站 接下来你就可以正式的寻找真正能帮助到你…

图的相关种类

目录 数据类型 存储结构 邻接矩阵表示法 无向图 邻接矩阵表示 有向图 网 实现 邻接矩阵表示 存储结构 创建无向图 优点 缺点 邻接表法表示 表示无向图 表示有向图 存储结构 无向网 特点 十字链表与多重表 十字链表 存储结构 多重表 存储结构 数据类型 存…

SharePoint:智能内容管理,释放数据价值

在Microsoft 365的庞大生态系统中&#xff0c;SharePoint常常被忽视&#xff0c;但它却是整个平台的核心。SharePoint不仅承载着OneDrive、Teams、Power Platform等所有Microsoft 365产品的内容存储&#xff0c;更是企业协作和内容管理的基石。助AI技术的加持&#xff0c;Share…

VBA实战(Excel)(4):实用功能整理

1.后台打开Excel 用于查数据&#xff0c;工作中要打开多个表获取数据再关闭的场景&#xff0c;利用此函数可以将excel表格作为后台数据库查询&#xff0c;快速实现客户要求&#xff0c;缺点是运行效率不够高。 Sub openexcel(exl_name As String)If Dir(addr, 16) Empty Then…

遗址博物馆ar互动展示软件提供丰富的趣味化体验

在自然博物馆的每一个角落&#xff0c;都隐藏着大自然的奥秘与魅力。为了让每一位参观者都能深入体验、探索这些奥秘&#xff0c;我们引入了前沿的AR技术&#xff0c;为您带来一场前所未有的沉浸式自然之旅。 步入博物馆&#xff0c;您手中的AR相机将成为您的更佳向导。自然博物…

Python语言在金融领域的应用探索

Python语言在金融领域的应用探索 Python语言&#xff0c;以其简洁、易读和强大的功能库&#xff0c;近年来在金融领域崭露头角。它不仅为数据分析师、量化分析师和交易员提供了强大的工具&#xff0c;还在风险管理、投资组合优化等方面发挥了重要作用。本文将深入剖析Python语…

剪画小程序:图片去除文字,我用它只要10秒!

Hello&#xff0c;大家好呀&#xff01;我是不会画画的小画~ 图片上的文字该如何去除&#xff1f; 在工作或者学习中&#xff0c;我们常常需要处理一些图片文件&#xff0c;比如扫描的文件、 电子文档等。有时候&#xff0c;图片上可能会有文字&#xff0c;这时候需要将图片…

解决富文本中抖音视频无法播放的问题——403

问题 富文本中的抖音视频无法播放&#xff0c;资源状态码是403禁止访问打开控制台&#xff0c;可以看到在项目中打开&#xff0c;数据请求的请求头多了一个Referer: http://localhost:3000/而复制链接在新窗口直接打开&#xff0c;请求头中并不会携带Referer 解决方案 在ind…

在 Windows 7 中安装 .NET Framework 时遇到错误:无法建立到信任根颁发机构的证书链

当全新安装 Windows 7 SP1 后&#xff0c;在未安装任何补丁&#xff0c;也未进行联网的状态下&#xff0c;安装 .NET Framework 4.6/4.7 或更高的版本时&#xff0c; 应该会遇到错误提示&#xff1a;无法建立到信任根颁发机构的证书链。 解决方法 1.下载证书 地址&#xff1…

Selenium三种等待方式的使用!

UI自动化测试&#xff0c;大多都是通过定位页面元素来模拟实际的生产场景操作。但在编写自动化测试脚本中&#xff0c;经常出现元素定位不到的情况&#xff0c;究其原因&#xff0c;无非两种情况&#xff1a;1、有frame&#xff1b;2、没有设置等待。 因为代码运行速度和浏览器…

QT creator c动态链接库的创建与调用

QT creator c动态链接库的创建与调用 QT5.15.2 1.创建dll项目 确保两类型选择正确 2.选择MinGW 64-bit 3.点击完成 pro文件参考&#xff1a; QT - guiTEMPLATE lib DEFINES QT_DLL_DEMO_LIBRARYCONFIG c17# You can make your code fail to compile if it uses deprecat…