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

网络编程 总结二

一、TCP

TCP模型

1. TCP搭建相关函数:

 套接字Socket

 1)Socket函数:

2)bind

 3)listen

 4)accept

 5)recv

 注意:

1> TCP中的recv 可以替换成read;         2>TCP中的recv可以替换成recvfrom

6)send

  注意:

1> TCP中的send 可以替换成 write;         2>TCP中的 send 可以替换成 sendto

7)connet

 客户端:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>#define ERR_MSG(msg) do{\fprintf(stderr,"liine %d",__LINE__);\perror(msg);\
}while(0)#define IP "192.168.8.77"  //本机IP 
#define PORT 6666          // 1024-49151int main(int argc, const char *argv[])
{//创建流式套接字int cfd = socket(AF_INET,SOCK_STREAM,0);if(cfd<0){ERR_MSG("socket");return -1;}printf("cfd=%d\n",cfd);//允许端口快速重用int reuse=1;if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}//填充地址信息结构体//真是的地址信息结构体根据地址族制定  AF_INET: man 7 ipstruct sockaddr_in sin;sin.sin_family = AF_INET;//必须填 AF_INETsin.sin_port = htons(PORT);//端口号, 1024-49151sin.sin_addr.s_addr = inet_addr(IP);//本机IP,ifconfig//连接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("connet");return -1;}printf("connect  sucess __%d__\n",__LINE__);char buf[128]="";ssize_t res=0;while(1){bzero(buf,sizeof(buf));printf("请输入数据>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;//发送if(send(cfd,buf,sizeof(buf),0)<0){ERR_MSG("send");return -1;}printf("send sucess\n");//接收bzero(buf,sizeof(buf));res=recv(cfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");return -1;}else if(0==res){printf("cfd=%d 服务器下线 __%d__\n",	cfd,__LINE__);break;}printf("cfd=%d %s __%d__\n",cfd,buf,__LINE__);}close(cfd);return 0;
}

服务器:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>#define ERR_MSG(msg) do{\fprintf(stderr,"liine %d",__LINE__);\perror(msg);\
}while(0)#define IP "192.168.8.77"  //本机IP 
#define PORT 6666          // 1024-49151int main(int argc, const char *argv[])
{//创建流式套接字int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}printf("sfd=%d\n",sfd);//允许端口快速重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}//填充地址信息结构体//真是的地址信息结构体根据地址族制定  AF_INET: man 7 ipstruct sockaddr_in sin;sin.sin_family = AF_INET;//必须填 AF_INETsin.sin_port = htons(PORT);//端口号, 1024-49151sin.sin_addr.s_addr = inet_addr(IP);//本机IP,ifconfig//将IP和端口号绑定到套接字上if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("bind sucess __%d__\n",__LINE__);//将套接字设置为被动监听状态,监听是否有客户端连接成功if(listen(sfd,128)<0){ERR_MSG("listen");return -1;}printf("listen success __%d__\n",__LINE__);struct sockaddr_in cin;        // 存储连接成功的客户端地址信息  socklen_t addrlen = sizeof(cin);//阻塞函数,从已完成连接的队列头中获取一个客户端信息//该文件描述符才是与客户端通信的文件描述符int newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){ERR_MSG("accept");return -1;}printf("[%s:%d] newfd=%d 连接成功 __%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port), newfd,__LINE__);char buf[128]="";ssize_t res=0;while(1){//接收res=recv(newfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");return -1;}else if(0==res){printf("[%s:%d] newfd=%d 连接成功 __%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port), newfd,__LINE__);break;}printf("[%s:%d] newfd=%d 连接成功 __%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port), newfd,__LINE__);//发送strcat(buf,"*_*");if(send(newfd,buf,sizeof(buf),0)<0){ERR_MSG("send");return -1;}printf("send sucess\n");}close(newfd);close(sfd);return 0;
}

二、UDP

UDP模型

 1. UDP相关函数

1)socket

2)bind

3)recvfrom

 4)sendto

 客户端:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\perror(msg);\
}while(0)#define SER_IP "192.168.8.77" //本机IP 
#define SER_PORT 6666#define CLI_IP "192.168.8.77" //本机IP 
#define CLI_PORT 8888int main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET, SOCK_DGRAM,0);if(cfd<0){ERR_MSG("socket");return -1;}
//*****************************************************	struct sockaddr_in cin;cin.sin_family  = AF_INET;      //必须填AF_INETcin.sin_port = htons(CLI_PORT);     //端口号的网络字节符cin.sin_addr.s_addr = inet_addr(CLI_IP);if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("bind");return -1;}printf("client bind success\n");
//********************************************************//填充服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family  = AF_INET;      //必须填AF_INETsin.sin_port = htons(SER_PORT);     //端口号的网络字节符sin.sin_addr.s_addr = inet_addr(SER_IP);struct sockaddr_in rcvaddr;//存储数据包是从哪里来的socklen_t addrlen = sizeof(rcvaddr);char buf[128]="";ssize_t res =0;while(1){bzero(buf,sizeof(buf));printf("请输入数据>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;//发送数据,发送给服务器if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("发送数据\n");//接收数据,必须接收数据包的发送方地址信息res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&rcvaddr,&addrlen);if(res<0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d]: %s\n",inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port),buf);}//关闭文件描述符close(cfd);return 0;
}

服务器:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>#define ERR_MSG(msg) do{\fprintf(stderr,"line%d",__LINE__);\perror(msg);\
}while(0)#define IP "192.168.8.77" //本机IP 
#define PORT 6666int main(int argc, const char *argv[])
{//创建报式套接字int sfd = socket(AF_INET, SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}//填充服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family  = AF_INET;      //必须填AF_INETsin.sin_port = htons(PORT);     //端口号的网络字节符sin.sin_addr.s_addr = inet_addr(IP);//绑定 必须绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}struct sockaddr_in cin;//存储数据包是从哪里来的socklen_t addrlen = sizeof(cin);char buf[128]="";ssize_t res =0;while(1){bzero(buf,sizeof(buf));//接收数据,必须接收数据包的发送方地址信息res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(res<0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d]: %s\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),buf);strcat(buf,"*_*");if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");}//关闭文件描述符close(sfd);return 0;
}

2.UDP中的connect 函数(重点

1>TCP中的connect函数会造成三次握手,将client 与 server 连接;UDP中的connect 仅仅是将对端的 IP 和端口号记录到内核中。此时UDP只能与记录的对端进行通信。

2>TCP中的connect 函数只能调用一次;UDP中的可以调用多次 connect 函数,刷新内核中对端的IP地址和端口,如果想要清空内核中对端的地址信息,则可以将sin_family 成员修改成AF_UNSPEC

3>当UDP采用connect 方式收发报文后,可以调用 send write 函数 也可以调用sendto函数。

1> sendto ( sd,buf,sizeof ( buf ) , NULL , 0 );

recvfrom 在后面的地址信息结构体填NULL 的时候,可以替换成 recv  read

2> recvfrom ( sockfd , buf, len , flags , NULL ,NULL );

 UDP调用connect 函数的优点:

1>提升传输效率:

a.  不调用connect :将对端的地址信息填充到内核--> 发送报文--->清空内核信息--->将对端的地址信息填充到内核-->发送报文--->清空内核信息

b.  调用了connect :将对端的地址信息填充到内核--> 发送报文--> 发送报文--> 发送报文--->清空内核信息

2>增加传输的稳定性:

a. 调用connect 函数的UDP通信,可以防止AB进程在数据传输过程中收到C进程消息,造成传输错误

3. UDP多点通信

【1】网络属性

setsockopt / getsockopt

 

 【2】多点通信

1. 单播

1>主机之间一对一的通信模式,交换机以及路由器对数据只进行转发,不复制

2>每次只有两个实体相互通信,发送端和接收端都是唯一确定的

2. 广播

1>主机之间一对多的通信模式,网络对其中的每一台主机发出的信号都进行无条件复制并转发

2>在同一个局域网下的所有主机都可以接收到广播信息

3>禁止广播数据穿过路由器,防止广播数据影响大面积主机

4>广播数据不需要应答,只有UDP才能做广播

5>广播地址:有效网络号+ 全是1 的主机号

1)广播的发送端(类似客户端)

1> socket    创建报式套接字    ;  bind  非必须绑定

2>setsockopt 设置允许广播:level: SOL_SOCKET   optname: SO_BROADCAST

3> 指定接收端的地址信息结构体

                a. IP :  填写广播IP

                b. PORT : 与接收端填充的一致即可

4> sendto    发送广播数据

2)广播的接收端(类似服务器)

1> socket    创建报式套接字    ;  bind  必须绑定

2>填充接收端自身的地址信息结构体

  a. IP :  填写广播IP :有效网络号 + 全是 1 的主机号

                调用bind 函数后,会将本机所有可用IP 地址都绑定到套接字上

                b. PORT : 与发送端填充的一致即可

3> recvfrom    接收广播数据

3. 组播(多播组)

1)组播的发送端(类似客户端)

1>socket    创建报式套接字    ;  bind 非必须绑定

2> 指定接收端的地址信息结构体

  a. IP :  填写组播IP  (224.0.0.0~239.255.255.255,与接收方填充一致)

                b. PORT : 与接收端填充的一致即可

3> sendto    发送组播数据

2)组播的接收端(类似服务器)

1> socket    创建报式套接字    ;  bind  必须绑定

2>setsockopt 加入多播组:level :  IPPROTO_IP     OPTNAME : IP_ADD_MEMBERSHIP   

3>填充接收端自身的地址信息结构体

          a. IP :  填写组播IP 

                b. PORT : 与发送端填充的一致即可

4> recvfrom    接收组播数据

多播snd:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\perror(msg);\
}while(0)#define GRP_IP "243.1.2.3" //本机IP 
#define PORT 6666int main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET, SOCK_DGRAM,0);if(cfd<0){ERR_MSG("socket");return -1;}//填充服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family  = AF_INET;      //必须填AF_INETsin.sin_port = htons(PORT);     //端口号的网络字节符sin.sin_addr.s_addr = inet_addr(GRP_IP);char buf[128]="";ssize_t res =0;while(1){bzero(buf,sizeof(buf));printf("请输入数据>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;//发送数据,发送给服务器if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("发送数据\n");}//关闭文件描述符close(cfd);return 0;
}

多播rcv:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>#define ERR_MSG(msg) do{\fprintf(stderr,"line%d",__LINE__);\perror(msg);\
}while(0)#define IP "192.168.0.79" //本机IP 
#define GRP_IP "224.1.2.3" //组播IP 
#define PORT 6666int main(int argc, const char *argv[])
{//创建报式套接字int sfd = socket(AF_INET, SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}//加入多播组struct ip_mreqn mq;mq.imr_multiaddr.s_addr = inet_addr(GRP_IP);//组播IPmq.imr_address.s_addr = inet_addr(IP);mq.imr_ifindex=2;if(setsockopt(sfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mq,sizeof(mq))<0){perror("setsockopt");return -1;}//填充服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family  = AF_INET;      //必须填AF_INETsin.sin_port = htons(PORT);     //端口号的网络字节符sin.sin_addr.s_addr = inet_addr(GRP_IP);//绑定 必须绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}struct sockaddr_in cin;//存储数据包是从哪里来的socklen_t addrlen = sizeof(cin);char buf[128]="";ssize_t res =0;while(1){bzero(buf,sizeof(buf));//接收数据,必须接收数据包的发送方地址信息res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(res<0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d]: %s\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),buf);}//关闭文件描述符close(sfd);return 0;
}

三、TFTP协议

1)TFTP协议概述:简单文件传输协议适用于在网络上进行文件传输的一套标准协议,使用UDP传输

特点:应用层协议;基于UDP协议实现

数据传输模式:

                     octet: 二进制模式(常用)

                     mail : 已经不在支持

2)TFTP下载模型

 3)TFTP通信过程总结

1>服务器在69号端口等待客户端的请求

2>服务器若批准请求,则使用临时端口与客户端进行通信

3>每隔数据包的编号都有变化(从1开始)

4>每隔数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的数据包或ACK包

5>数据长度以512Byte传输,小于512Byte的数据意味着数据传输结束

 4)TFTP协议分析

 代码:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\perror(msg);\
}while(0)#define SER_IP "192.168.171.1" //本机IP 
#define SER_PORT 69int do_download(int cfd, struct sockaddr_in sin)
{//下载请求char filename[20]="";char buf[516]={0};printf("请输入要下载的文件名>>");scanf("%s",filename);while(getchar()!=10);short*p1 = (short*)buf;*p1 = htons(1);char*p2 = buf+2;strcpy(p2,filename);char*p3 = p2+strlen(p2);char*p4 = p3+1;strcpy(p4,"octet");int size=strlen(p2)+strlen(p4)+4;//发送下载请求协议if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");int fd=-1;socklen_t  addrlen=sizeof(sin);ssize_t res =0;unsigned short num=0;int ret=0;	while(1){bzero(buf,sizeof(buf));//接收数据,必须接收数据包的发送方地址信息res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);if(res<0){ERR_MSG("recvfrom");ret=-1;break;}if(buf[1]==3){if(htons(num+1)==*(unsigned short*)(buf+2)){//组数据包给服务器num++;if(1==ntohs(*(unsigned short*)(buf+2))){fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd<0){ERR_MSG("open");return -1;}}if(write(fd,buf+4,res-4)<0){ERR_MSG("write");ret=-1;break;}//回复ACK,由于ACK包和数据包前四个字节只有操作码不一致//直接修改数据包的操作码buf[1]=4;if(sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");ret =-1;break;}if(res-4<512){printf("文件:%s 上传完毕\n",filename);break;}}}else if(buf[1]==5)//错误包{fprintf(stderr,"DOWNLOAD_EROR: %d: %s\n",ntohs(*(unsigned short*)(buf+2)),buf+4);break;}}close(fd);return ret;
}int main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET, SOCK_DGRAM,0);if(cfd<0){ERR_MSG("socket");return -1;}//填充服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family  = AF_INET;      //必须填AF_INETsin.sin_port = htons(SER_PORT);     //端口号的网络字节符sin.sin_addr.s_addr = inet_addr(SER_IP);char c=0;while(1){system("clear");printf("*****************\n");printf("******1.下载*****\n");printf("******2.上传*****\n");printf("******3.退出*****\n");printf("*****************\n");c=getchar();while(getchar()!=10);switch(c){case'1':do_download(cfd,sin);break;case'2':break;case'3':goto END;break;default:printf("输入错误,请重新输入\n");}printf("请输入任意字符清屏>>>");while(getchar()!=10);}END:close(cfd);return 0;
}

相关文章:

网络编程 总结二

一、TCP TCP模型 1. TCP搭建相关函数&#xff1a; 套接字Socket 1&#xff09;Socket函数&#xff1a; 2&#xff09;bind 3&#xff09;listen 4&#xff09;accept 5&#xff09;recv 注意&#xff1a; 1> TCP中的recv 可以替换成read&#xff1b; 2>TCP中的…...

消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务

根据国外科技媒体 iMore 报道&#xff0c;基于消息源 analyst941 透露的信息&#xff0c;苹果公司目前并未开发 MFi 限制。 根据推文信息内容&#xff0c;两款 iPhone 15 机型的最高充电功率为 20W&#xff0c;而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…...

设计模式——工厂模式(简单工厂、工厂方法、抽象工厂)

是什么&#xff1f; 工厂模式的目的是将创建对象的具体过程隐藏起来&#xff0c;从而达到更高的灵活性 工厂模式分为&#xff1a;简单工厂模式、工厂方法模式、抽象工厂模式&#xff1b; 为什么&#xff1f; 在Java中&#xff0c;万物皆是对象&#xff0c;我们在使用的时候…...

《C语言技术体系》 学习路线总目录 + 思维导图

目录 前言 正文 思维导图 第1章 流程结构 1.1 初识C语言 1.2 流程结构 1.3 数据类型 1.4 运算符表达式 第2章 指针与数组 2.1 指针基本概念 2.2 一维数组 2.3 二维及多维数组 2.4 指针与数组 第3章 模块化重构 3.1 函数 3.2 typedef类型定义 3.3 enum枚举 3.…...

数字图像处理简答题

目录 1.人类视觉对颜色的主观感觉包括哪三类&#xff1f; 2. 图像成像的过程包括哪三步&#xff1f; 3.图像的采样和量化分别指什么&#xff1f; 4、取k8时&#xff0c;将下图用相应矩阵表示 5、简述当限定了数字图像的数据量时采样和量化参数的选择遵循哪两条原则&#x…...

【Java校招面试】基础知识(五)——GC

目录 前言一、基础概念二、垃圾回收算法三、垃圾收集器四、引用后记 前言 本篇主要介绍Java垃圾回收机制——GC的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第五篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专…...

使用CMake调用Makefile 项目

目录标题 基本示例Cmake传递lib给MakefileCmake传递参数给Makefile&#xff0c;比如make cleanWindows下使用Cmake调用Makefile 基本示例 如果项目是使用传统的Makefile构建的&#xff0c;并且您希望使用CMake调用这些Makefile&#xff0c;您可以使用CMake的add_custom_target…...

快速傅里叶变换FFT学习笔记

点值表示法 我们正常表示一个多项式的方式&#xff0c;形如 A ( x ) a 0 a 1 x a 2 x 2 . . . a n x n A(x)a_0a_1xa_2x^2...a_nx^n A(x)a0​a1​xa2​x2...an​xn&#xff0c;这是正常人容易看懂的&#xff0c;但是&#xff0c;我们还有一种表示法。 我们知道&#xf…...

如何下载安装驱动

1 打开浏览器 这里以Edge浏览器举例 第一步打开桌面上的Edge浏览器 如果您的桌面上没有 那么找到搜索栏 搜索Edge 然后打开 打开之后一般是这样 然后把我发送您的地址 驱动下载地址 https://t.lenovo.com.cn/yfeyfYyD &#xff08;这个网址只是一个例子&#xff09; 删除掉前…...

鸿蒙Hi3861学习四-Huawei LiteOS介绍

一、什么是LitesOS Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统&#xff0c;是华为物联网战略的重要组成部分&#xff0c;具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力。基于物联网领域业务特征打造领域性技术栈&#xff0c;为开发者提供“一…...

Vue核心 收集表单数据 过滤器

1.14. 收集表单数据 收集表单数据: 若: &#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值。若: &#xff0c;则v-model收集的是value值&#xff0c;且要给标签配置value值。若: 没有配置input的value属性&#xff0c;那么收集的就是checked(勾选 or 未…...

华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包

华为EC6108V9E&#xff0f;EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的…...

数字化转型导师坚鹏:面向数字化转型的大数据顶层设计实践

面向数字化转型的大数据顶层设计实践 课程背景&#xff1a; 数字化背景下&#xff0c;很多企业存在以下问题&#xff1a; 不清楚大数据思维如何建立&#xff1f; 不清楚企业大数据分析方法&#xff1f; 不了解大数据应用成功案例&#xff1f; 课程特色&#xff1a; …...

day27_mysql

今日内容 零、 复习昨日 一、单表查询 二、多表联查 零、 复习昨日 1 DDL,DML,DQL是啥 DDL 数据定义语言&#xff08;库&#xff0c;表&#xff0c;列&#xff09;DML 数据操作语言&#xff08;表内数据的操作增删改&#xff09;DQL 数据查询语言&#xff08;表内数据的查询&am…...

QwtPlotCurve使用说明

QwtPlotCurve是Qwt库中用于绘制曲线的类&#xff0c;可以在QwtPlot上绘制各种类型的曲线&#xff0c;如折线、样条线、散点等。以下是QwtPlotCurve的一些常用函数和使用说明&#xff1a; setSamples(const QPolygonF &samples)&#xff1a;设置曲线的数据点&#xff0c;参数…...

JS逆向 -- 某平台登录加密分析

一、打开网站&#xff0c;使用账号密码登录 账号&#xff1a;aiyou123.com 密码&#xff1a;123456 二、通过F12抓包&#xff0c;抓到如下数据&#xff0c;发现密码加密了 三、加密结果是32位&#xff0c;首先考虑是md5加密。 四、全局搜索pwd&#xff0c;点击右上角&#xf…...

一分钟快速实现Flask框架的蓝图和视图

一分钟快速实现Flask框架的蓝图和视图 Flask是一个轻量级的Web应用框架&#xff0c;非常适合快速开发小型的Web应用。Flask框架使用蓝图&#xff08;Blueprint&#xff09;和视图&#xff08;View&#xff09;的概念来组织应用程序的代码。在本文中&#xff0c;我们将介绍如何…...

Mysql 约束练习【第13章_约束】

#第13章_约束 /* 基础知识 1.1 为什么需要约束&#xff1f; 为了保证数据的完整性&#xff01; 1.2 什么叫约束&#xff1f;对表中字段的限制。 1.3 约束的分类&#xff1a; 角度1&#xff1a;约束的字段的个数 单列约束 vs 多列约束 角度2&#xff1a;约束的作用范围 列…...

java调用cmd命令

1.首先&#xff0c;我们需要了解一下 java是如何调用 cmd的&#xff1a; 6.在实际的开发中&#xff0c;我们有可能会遇到 java调用 cmd命令的情况&#xff1a; 7.对于一些特定的环境下&#xff0c;例如在嵌入式系统中&#xff0c;那么我们可以使用下面这种方式来调用 cmd命令&a…...

Qt音视频开发36-超时检测和自动重连的设计

一、前言 如果网络环境正常设备正常,视频监控系统一般都是按照正常运行下去,不会出现什么问题,但是实际情况会很不同,奇奇怪怪七七八八的问题都会出现,就比如网络出了问题都有很多情况(交换机故障、网线故障、带宽故障等),所以监控系统在运行过程中,还得做超时检测,…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...