当前位置: 首页 > 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-超时检测和自动重连的设计

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

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...