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

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...