网络编程 总结二
一、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搭建相关函数: 套接字Socket 1)Socket函数: 2)bind 3)listen 4)accept 5)recv 注意: 1> TCP中的recv 可以替换成read; 2>TCP中的…...
消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务
根据国外科技媒体 iMore 报道,基于消息源 analyst941 透露的信息,苹果公司目前并未开发 MFi 限制。 根据推文信息内容,两款 iPhone 15 机型的最高充电功率为 20W,而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…...
设计模式——工厂模式(简单工厂、工厂方法、抽象工厂)
是什么? 工厂模式的目的是将创建对象的具体过程隐藏起来,从而达到更高的灵活性 工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式; 为什么? 在Java中,万物皆是对象,我们在使用的时候…...
《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.人类视觉对颜色的主观感觉包括哪三类? 2. 图像成像的过程包括哪三步? 3.图像的采样和量化分别指什么? 4、取k8时,将下图用相应矩阵表示 5、简述当限定了数字图像的数据量时采样和量化参数的选择遵循哪两条原则&#x…...
【Java校招面试】基础知识(五)——GC
目录 前言一、基础概念二、垃圾回收算法三、垃圾收集器四、引用后记 前言 本篇主要介绍Java垃圾回收机制——GC的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第五篇博文,如有需要,可: 点击这里,返回本专…...
使用CMake调用Makefile 项目
目录标题 基本示例Cmake传递lib给MakefileCmake传递参数给Makefile,比如make cleanWindows下使用Cmake调用Makefile 基本示例 如果项目是使用传统的Makefile构建的,并且您希望使用CMake调用这些Makefile,您可以使用CMake的add_custom_target…...
快速傅里叶变换FFT学习笔记
点值表示法 我们正常表示一个多项式的方式,形如 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)a0a1xa2x2...anxn,这是正常人容易看懂的,但是,我们还有一种表示法。 我们知道…...
如何下载安装驱动
1 打开浏览器 这里以Edge浏览器举例 第一步打开桌面上的Edge浏览器 如果您的桌面上没有 那么找到搜索栏 搜索Edge 然后打开 打开之后一般是这样 然后把我发送您的地址 驱动下载地址 https://t.lenovo.com.cn/yfeyfYyD (这个网址只是一个例子) 删除掉前…...
鸿蒙Hi3861学习四-Huawei LiteOS介绍
一、什么是LitesOS Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力。基于物联网领域业务特征打造领域性技术栈,为开发者提供“一…...
Vue核心 收集表单数据 过滤器
1.14. 收集表单数据 收集表单数据: 若: ,则v-model收集的是value值,用户输入的就是value值。若: ,则v-model收集的是value值,且要给标签配置value值。若: 没有配置input的value属性,那么收集的就是checked(勾选 or 未…...
华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包
华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的…...
数字化转型导师坚鹏:面向数字化转型的大数据顶层设计实践
面向数字化转型的大数据顶层设计实践 课程背景: 数字化背景下,很多企业存在以下问题: 不清楚大数据思维如何建立? 不清楚企业大数据分析方法? 不了解大数据应用成功案例? 课程特色: …...
day27_mysql
今日内容 零、 复习昨日 一、单表查询 二、多表联查 零、 复习昨日 1 DDL,DML,DQL是啥 DDL 数据定义语言(库,表,列)DML 数据操作语言(表内数据的操作增删改)DQL 数据查询语言(表内数据的查询&am…...
QwtPlotCurve使用说明
QwtPlotCurve是Qwt库中用于绘制曲线的类,可以在QwtPlot上绘制各种类型的曲线,如折线、样条线、散点等。以下是QwtPlotCurve的一些常用函数和使用说明: setSamples(const QPolygonF &samples):设置曲线的数据点,参数…...
JS逆向 -- 某平台登录加密分析
一、打开网站,使用账号密码登录 账号:aiyou123.com 密码:123456 二、通过F12抓包,抓到如下数据,发现密码加密了 三、加密结果是32位,首先考虑是md5加密。 四、全局搜索pwd,点击右上角…...
一分钟快速实现Flask框架的蓝图和视图
一分钟快速实现Flask框架的蓝图和视图 Flask是一个轻量级的Web应用框架,非常适合快速开发小型的Web应用。Flask框架使用蓝图(Blueprint)和视图(View)的概念来组织应用程序的代码。在本文中,我们将介绍如何…...
Mysql 约束练习【第13章_约束】
#第13章_约束 /* 基础知识 1.1 为什么需要约束? 为了保证数据的完整性! 1.2 什么叫约束?对表中字段的限制。 1.3 约束的分类: 角度1:约束的字段的个数 单列约束 vs 多列约束 角度2:约束的作用范围 列…...
java调用cmd命令
1.首先,我们需要了解一下 java是如何调用 cmd的: 6.在实际的开发中,我们有可能会遇到 java调用 cmd命令的情况: 7.对于一些特定的环境下,例如在嵌入式系统中,那么我们可以使用下面这种方式来调用 cmd命令&a…...
Qt音视频开发36-超时检测和自动重连的设计
一、前言 如果网络环境正常设备正常,视频监控系统一般都是按照正常运行下去,不会出现什么问题,但是实际情况会很不同,奇奇怪怪七七八八的问题都会出现,就比如网络出了问题都有很多情况(交换机故障、网线故障、带宽故障等),所以监控系统在运行过程中,还得做超时检测,…...
Reactor 第九篇 WebFlux重构个人中心,效果显著
1 重构背景 原有的开发人员早已离职,代码细节没人知道,经过了一段时间的维护,发现有以下问题: 个人中心系统的特征就是组装各个业务的接口,输出个人中心业务需要的数据,整个系统调用了几十个第三方业务线的…...
Vben Admin 自学记录 —— Drawer组件的基本使用及练习(持续更新中...)
Drawer 抽屉组件 对 antv 的 drawer 组件进行封装,扩展拖拽,全屏,自适应高度等功能。 Drawer相关使用及概念 练习 —— 在之前table基础上,添加查看功能,点击查看按钮,弹出抽屉显示单条表格数据…...
Android 9.0 根据包名默认授予app悬浮窗权限
1.概述 在9.0的设备开发中,对于在app中授予悬浮窗权限,也是通常用的功能,但在设备产品中预制app,需求要求默认授予悬浮窗权限, 就不需要在app中动态申请悬浮窗权限了,所以就来分析下这个实现这个功能 2.根据包名默认授予app悬浮窗权限的核心类 packages\apps\Settings\s…...
Swift中Data,String,[UInt8]的相互转换(6种互相转换)
var dataData() var array[UInt8]() var str"" //Data[UInt8] data.append(10) array[UInt8](data) print(array)//[10] //[UInt8]转Data array[1,2,3,4,5] dataData(array) print(data.count)//5 //Data转String data.removeAll() data.append(contentsOf:[0x31,…...
【微软Bing王炸更新】无需等待,人人可用,答案图文并茂,太牛了
🚀 AI破局先行者 🚀 🌲 AI工具、AI绘图、AI专栏 🍀 🌲 如果你想学到最前沿、最火爆的技术,赶快加入吧✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆&am…...
腾讯云的cdn怎么配置|腾讯云CDN配置教程
众所周知,WordPress系统不挂加速或者是服务器不好速度贼慢,所以要想办法解决访问速度的问题,经过我不断的研究腾讯云的CDN,因为我用的是zibll子比主题,不懂的就挂会导致无法使用第三方登录,因为有缓存导致一直不回调一直卡在那个登录界面和支付没反应要么出现二维码,要么…...
数据结构入门-顺序表链表
线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种实际中广泛使用多个数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。…...
【AWS入门】AWS Lamda
目录 创建一个Lamda函数用Lamda函数控制启停EC2实例创建一台EC2实例创建角色创建lamda函数 使用Amazon EventBridge计划启停实例创建EventBridge 用户往S3存储桶上传图片文件,触发Lambda函数,将图片压缩并上传至另一个存储桶创建两个存储桶通过Cloudform…...
牛客刷SQL题Day5
SQL69 返回产品并且按照价格排序 select prod_name , prod_price from Products where prod_price between 3 and 6 select prod_name , prod_price from Products where 6>prod_price and prod_price >3 踩坑1: between......and.......包括边界。 踩坑2&am…...
【Errors】【计算机图形学】A-SDF复现的一点纠正记录
ICCV 2021的工作A-SDF,在跑的过程中可能是一些版我Run了这篇工作代码的Reconstruction,然后出现了一点小小的错误,记录如下。 问题一:对数据做直接修改导致出错(可能是不同的pytorch版本导致的?) 错误描述…...
建设网站报告书/免费推广引流平台
我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要进来干一场,尽管王总从事的行当也算跟IT沾边,但毕竟太长时间不接触技术…...
在线旅游网站建设方案/设计网站logo
使用redis在同一台机器上,启用多个端口,实现多个实例,完成集群的模拟实现。 启动多实例redis默认启动端口为6379,我们可以使用 --port 来指定多个端口,如下,在linux终端命令: redis-server &…...
wordpress 主页添加来源/网站推广的渠道有
# 文件和代码模板在这个部分:* 文件和代码模板* [概述](#概述)* [项目和默认方案](#项目和默认方案)* [预定义、内部和定制模板](#预定义、内部和定制模板)* [什么时候使用文件和代码模板](#什么时候使用文件和代码模板)* [解析指令](/如何使用/常规指南/文件和代码…...
个人网站需要买服务器吗/个人网站制作源代码
最近使用mediaelementjs做一个iPad上的Html5的video标签的播放器包装. 首先感谢一下mediaelementjs这样的开源项目, 可用度极高, 代码质量明显比我自己写要好多了, 模块化清晰, 许可证很开放(MIT). 开发的过程中遇到了些浏览器兼容问题, 也涉及到一下iPad这样的平板平板设备上…...
页面设计优缺点/北京seo做排名
http://www.brickcom.com/products/DetailView.php?modelnameCMS-Client&seriesCMS#product-support http://ihomeapp.cn/dl_files/CMSClient-manual.pdf转载于:https://www.cnblogs.com/fx2008/p/5999035.html...
可以自己制作视频的软件/沈阳网站优化
就目前的感觉,js的用途还是挺大的,而作为一个将要出道的小小程序仔,学习一下js还是很有必要的,js的总体感觉其实和别的编程语言差别不打,熟悉一下api很容易上手:现在就通过一个猜数字小游戏,熟悉…...