基于linux下实现的ping程序(C语言)
linux下实现的ping程序
一、设计目的
PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。
课程设计中选取PING程序的设计,其目的是通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。
熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等。
二、设计内容
2.1 RAW模式的SOCKET编程
PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。
2.2 具体内容
2.2.1 定义数据结构
定义IP数据报、ICMP包等相关的数据结构。
ICMP数据头结构
typedef struct Icmp
{unsigned char type; //类型unsigned char code; //代码unsigned short check_sum; //检验和unsigned short id; //标识符unsigned short seq; //序列号
}IcmpHeader;
IP数据包头结构
typedef struct iphdr
{ unsigned int headLen:4; //首部长度unsigned int version:4; //版本unsigned char tos; //区分服务unsigned short totalLen; //总长度unsigned short ident; //标识unsigned short fragAndFlags; //标志与片偏移unsigned char ttl; //生存时间unsigned char proto; //协议unsigned short checkSum; //检验和unsigned int sourceIP; //源地址unsigned int destIP; //目的地址
}IpHeader;
2.2.2 程序实现
在LINUX环境下实现PING程序
2.2.3 程序功能
- ping ip 地址
如ping 192.168.1.1 - ping 域名(进行DNS解析)
如ping www.baidu.com - 参数“ -n 数字”进行设置ping 的次数
如ping www.baidu.com –n 10 - 参数 -t 无限循环
如ping 192.168.1.140 -t - 分析ping到的数据报
如最短时间,最长时间,平均时间和丢包率 - ping ?
提供帮助提示
三、实验平台与语言
- 平台:linux
- 语言:C语言
四、功能模块实现
4.1 总体设计方案
流程图
主要代码
// ICMP数据头结构
typedef struct Icmp
{unsigned char type; //类型unsigned char code; //代码unsigned short check_sum; //检验和unsigned short id; //标识符unsigned short seq; //序列号
}IcmpHeader;
//执行ping功能
int ping(const char *ip, int send_count)
{int rawfd;struct sockaddr_in dest_adr;char icmp_data[1024];int size = sizeof(IcmpHeader)+32;int r, i = 0, send, recv=0, lost=0;char recv_buf[1024];int all_time[1024] = {0};//创建原始套接字rawfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if(rawfd == -1) {perror("create socket failed!");return -1;}//设置目的地址与端口dest_adr.sin_family = AF_INET;dest_adr.sin_port = htons(80);inet_aton(ip, &dest_adr.sin_addr);//封装icmp数据包pack_icmp(icmp_data, size);printf("\n正 Ping %s 具有%d个字节的数据:\n", ip, size-sizeof(IcmpHeader));if(send_count == LOOP){//无限循环while(1){if(ping_one(rawfd,dest_adr, ip, icmp_data , all_time) != -1){recv++;}send++;}}else{for(i = 0; i<send_count; i++) {if(ping_one(rawfd,dest_adr, ip, icmp_data , all_time) != -1){recv++; }send++;}}printf("\n%s 的 Ping 统计信息:\n 数据包:已发送 = %d,已接收 = %d, 丢失
= %d<%.1f%% 丢失>, \n",ip, send, recv, lost, ((float)lost/(float)send)*100);printf("往返行程的估计时间:\n 最短=%dms 最长=%dms 平均 = %dms \n\n",min(all_time, send), max(all_time, send), average(all_time, send));close(rawfd);return 0;
}
4.2 DNS域名解析功能实现
4.2.1 DNS 服务器
- 地址:202.96.134.133
- 端口:53
# define DNS_PORT 53
# define DNS_IP "202.96.134.133"
# define DNS_IP2 "8.8.8.8"
4.2.2 DNS 的实现基础:
通过UDP发送查询报文给DNS 服务器,然后从服务通过UDP 返回的回应报文中解析得到对应域名的IP。
4.2.3 DNS 报文格式
4.2.4 首部格式
其中标志字段:16位
定义首部结构体
typedef struct DNSheader
{unsigned short id;unsigned char qr_opcode_aa_tc_rd;unsigned char ra_zero_rcode;unsigned short qdcount;unsigned short ancount;unsigned short nscount;unsigned short arcount;
}DnsHeader;
4.2.5 问题记录格式
- 查询名字:域名的可变长字段;其中计数字段指明每一节中的字符数
- 查询类型:16位;值的意义如下表,查询ip 时为1
- 查询类别:16位;定义使用DNS的特定协议, 一般为1
查询名字打包代码:
//把域名打包成dns数据报的数据部分 如(3www5baidu3com)
//计算每段的数量
for(i = 0; i < name_len; i++)
{if(netname[i] == '.'){len[flg++] = i - s;s += len[flg-1]+1;}
}
len[flg] = i - s;
i = 0;
flg = 0;
data[i++] = len[flg++];
//加入每段字节的数量
for(; i < name_len+1; i++)
{if(netname[i-1] == '.'){data[i] = len[flg++];}else{data[i] = netname[i-1];}
}
4.2.6 资源记录格式
资源数据:可变长;值内容取决于类型字段的值,可以是数值、域名、偏移指针、字符串。
4.2.7 在资源数据中提取ip和原域名
失败的解决方法
由于没有查到详细的解析资料,因此通过对整个报文每个字节进行分析,发现其格式的规律:ip地址放在报文的末尾,可以通过指针快速定位。
采样分析的域名有(www.baidu.com 和 www.sina.com),下图是对 www.baidu.com 的分析。
代码如下:
//直接定位ip地址
Ipadr *ip =(Ipadr *) (sen_buf+(r-8-4-8-2));
//如果ip地址长度不为4, 则返回
if(ip->len != 0x0400)
{return -1;
}
//次ip地址转为字符串
sprintf(get_ip, "%u.%u.%u.%u", ip->a, ip->b, ip->c, ip->d);
失败原因:过于投机取巧,取得两个分析对象不够特殊,对DNS回答格式完全不解
新的解决方法
通过用wireshark抓取DNS包进行分析,由于分析次数过多,此处以 www.baidu.com 为例。
由抓取的dns包分析可得到回答部分的格式如下:
answer1:
name : 不定长,c0 0c指段偏移地址
type: 16 位 0005 是别名answer
class: 16位, 0001
ttl:32位
data length: 16位
cname: 别名,长度data lengthanswer 2
name:c0 2b 指向别名
type: 16位 0001 是ip answer
class : 16位 0001
ttl: 32位
data length:16位
address: 4个字节
answer 3
与回应2相似 ip 不一样
进一步分析
可以发现回答部分有两个类型(只是本设计的情况,DNS有很多种类型),type 字段为5时为别名回应,为1 时为ip回应,因此通过type和上面得到的格式来进行ip和别名的获取。
其中还发现,DNS为了减小数据报文的长度,回应部份重复的字段会省略,并通过偏移指针指向重复部分,由上面的分析可知是用c0(代替字段长度)来转义下一字节为偏移指针。
获取代码设计
int parse_dns_respone(unsigned char *recv_buf,unsigned char **answer_o, int data_len ,char
*get_ip, const char *netname)
{int asw_type;int i,j, k;static int fn = 0, fi = 0;int r;unsigned char cname[40];unsigned char *answer = *answer_o;answer +=2;//查询域名asw_type = ntohs(*((unsigned short*)answer));answer +=2;//typeanswer +=2;//classanswer +=4;//ttlif(asw_type == 5) //域名包{bzero(cname, sizeof(cname));//解析域名parse_dns_name(recv_buf, &answer, cname);fn = 1; //标记已取得别名}else if(asw_type == 1) //ip 回应包{//解析IPparse_dns_ip(&answer ,get_ip);if(fn == 1)printf("\n---- %s(%s)",cname , get_ip);elseprintf("\n---- %s(%s)",netname , get_ip);fi = 1; //标记已取得IP}*answer_o = answer;if(fn != 0 && fi != 0) return 2; //已取得别名和域名。则结果else if(fi != 0) return 1;return 0;
}//解析IP
void parse_dns_ip(unsigned char **answer_o ,char *get_ip)
{ unsigned char *answer = *answer_o;Ipadr *ip =(Ipadr *)answer; //取提ip sprintf(get_ip, "%u.%u.%u.%u", ip->a, ip->b, ip->c, ip->d);*answer_o = answer;}
//解析域名
void parse_dns_name(unsigned char *recv_buf, unsigned char **answer_o, unsigned char *cname)
{ int tmp_len;int d_length;int i, k;unsigned char *answer = *answer_o;d_length = ntohs(*((unsigned short*)answer));//总长度answer +=2; //data lengthi=0;for(k=0; k<d_length; k++){tmp_len = *answer++; //名字段长度if(i != 0)cname[i++]='.';if(tmp_len == 0xc0) //CO转义为复字段{int tmp = *answer++; //获得偏移指针k ++;i--;while(1){tmp_len = recv_buf[tmp++];//跳转到偏移位置if(tmp_len == 0) break; //偏移位置结果cname[i++]='.';//填充域名get_seg_name(&recv_buf[tmp], cname+i, tmp_len);tmp += tmp_len;i += tmp_len;}continue;} if(tmp_len == 0) break;//填充域名get_seg_name(answer, cname+i, tmp_len);k += tmp_len;i += tmp_len;//移动指针answer += tmp_len;}cname[i] = '\0';*answer_o = answer;
}
4.2.8 遇到的问题
有多段连续的域名字段重复
原来只考虑到有一个域名字段是重复的,但是有些是有多段连续的域名字段重复的,解决的方法是(直到len字节为0 才认为没有重复字段了)。
while(1)
{tmp_len = recv_buf[tmp++];//跳转到偏移位置if(tmp_len == 0) break; //偏移位置结果cname[i++]='.';//填充域名get_seg_name(&recv_buf[tmp], cname+i, tmp_len);tmp += tmp_len;i += tmp_len;
}
有多个域名回答
原来只考虑到只有一个域名名回答,但有些(如 www.sina.com )是有多个域名的,因此解决方法是域名回答可以多次解析,只有取得IP地址才结束,而不是原来只解析两个回答就认为拿到了IP地址。
4.2.9 本实现的不足
- 没有完全掌握DNS 回应报文的格文
- 服务器单一,没有备用服务器
- 还存在未知域名不能解析的,未能确保能解析所有正确域名
五、结果分析
Ping ip 地址 如 ping 192.168.1.1
Ping 域名 如:ping www.sougou.com
Ping –n 如:ping 14.215.177.37 –n 2
Ping –t 如: ping www.baidu.com -t
Ping ?
六、心得体会
做的永远比想象中的难,修改了多次代码,刚开始想只要IP 地址,要愿意深入分析回应数据报,只是进过一些特例来定位ip 地址就好,想不到两个特例效果是一样的(www.baidu.com 和 www.sina.com ), ip 地址都是在末尾前几个字节,但是,由于DNS 的去掉重复的功能,造成只有是只有2个IP 地址的域名才能有效,多于或少于两个的都不行,因此又得花时间重新进行分析,然后才想到利用抓包软件来协助分析,又花了不少心血修正这个BUG,程序员真不好做,坐到腰酸背痛。
但是,还情事还没那么顺利,拿多几个域名来试之后又发现了问题,具有多个别名的域名没办法正确解析,在原来的基础上又很难修改,因此决定把代码封装起来,封装多几个函数,然后在封装好的基础上解决多个别名的问题,但是在调试中又出现多个连绵的域名字段重复省略导致解析也来的域名完全的问题,又进行了一番修改。真不容易。
总结
- DNS的格式还需要找相关资料来学习
- 以后写代码如果不是用于学习的,则应该找完成的框架进行修改,这样可以省时间,且写出来的程序也会比较稳定
- 写程序前最好先做出详细方案,避免一些BUG
- 网络知识的学习还有很多要学,网络编程要学的知识更加多
相关文章:
基于linux下实现的ping程序(C语言)
linux下实现的ping程序 一、设计目的 PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。 课程设…...
109.【C语言】数据结构之求二叉树的高度
目录 1.知识回顾:高度(也称深度) 2.分析 设计代码框架 返回左右子树高度较大的那个的写法一:if语句 返回左右子树高度较大的那个的写法二:三目操作符 3.代码 4.反思 问题 出问题的代码 改进后的代码 执行结果 1.知识回顾…...
线段覆盖(c++)
题目描述 在一条数轴上,有 N 条线段,第 i 条线段的左端点是 si,右端点是 ei。如果线段有重叠(即使是端点重叠也算是重叠),则输出 “impossible”, 如果没有重叠则输出 “possible” 。 输入格式 多组…...
SSM 仓库管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
基于Python3编写的Golang程序多平台交叉编译自动化脚本
import argparse import os import shutil import sys from shutil import copy2from loguru import loggerclass GoBuild:"""一个用于构建跨平台执行文件的类。初始化函数,设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的…...
SqlSugar查询达梦数据库遇到的异常情况(续)
之前的文章提到在SqlSugar的Where函数中使用!string.IsNullOrEmpty函数查询达梦数据库时,明明数据库中有数据但就是查不出来,但相同的代码在另一台电脑上就可以正常返回数据。 以下图中的两张表数据为例,执行下面的SQL语句无法查询到数据…...
企业电子投票系统 【源码+文档】
目 录 第1部分 概 述 第2部分 分析部分 2.1.功能需求 第3部分 系统设计 3.1.功能模块设计 3.2.数据库的设计 第4部分 系统开发 4.1.数据库 4.1&a…...
如何正确地安装和设置魔方财务软件?
安装和设置魔方财务软件需要按照以下步骤进行操作: 下载安装程序:首先,到魔方财务软件的官方网站或认可的软件下载网站下载安装程序。确保选择与您的操作系统兼容的版本。 运行安装程序:双击安装程序,按照提示进行安装…...
在Ubuntu 22.04 LTS中使用PyTorch深度学习框架并调用多GPU时遇到indexSelectLargeIndex相关的断言失败【笔记】
在Ubuntu 22.04 LTS系统中,已安装配置好CUDA 12.4、cuDNN 9.1.1以及PyTorch环境 export CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 在PyTorch深度学习框架训练调用多GPU时,提示 indexSelectLargeIndex: block: [x, 0, 0], thread: [x, 0, 0] Assertion src…...
[网络安全]XSS之Cookie外带攻击姿势详析
概念 XSS 的 Cookie 外带攻击就是一种针对 Web 应用程序中的 XSS(跨站脚本攻击)漏洞进行的攻击,攻击者通过在 XSS 攻击中注入恶意脚本,从而窃取用户的 Cookie 信息。 攻击者通常会利用已经存在的 XSS 漏洞,在受害者的…...
springmvc的拦截器,全局异常处理和文件上传
拦截器: 拦截不符合规则的,放行符合规则的。 等价于过滤器。 拦截器只拦截controller层API接口。 如何定义拦截器。 定义一个类并实现拦截器接口 public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest reque…...
TypeScript进阶实战:构建可维护的企业级应用
"这代码太难维护了!"接手一个海外客户的项目后,我不禁感叹道。虽然项目用了 TypeScript,但类型定义混乱,代码提示基本失效,测试写起来也很痛苦。作为一个有着多年 TypeScript 开发经验的工程师,我…...
请求go web后端接口 java安卓端播放视频
前端代码 添加gradle依赖 implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0 添加访问网络权限 <uses-permission android:name"android.permission.INTERNET" />允许http 请求请求 andro…...
Java 学习(四)集合框架与异常处理
在 Java 编程中,集合框架和异常处理机制是开发高效、健壮程序的两个关键部分。掌握这两个方面的知识,能够大大提高代码的质量和可维护性。本篇博客将深入探讨 Java 集合框架和异常处理机制的核心概念,并结合实际案例,帮助你更好地…...
如何调用yolov8的模型(restful和c++)
文章目录 方法一、通过RESTful API调用(推荐)第一步:部署yolo8服务端第二步:java中调用api方法二、JNI调用(本地调用)第一步:编写c/c++封装代码第二步:生成jni头文件和动态库第三步:在java中调用jni函数参考: 1.window系统下从0开始搭建yolov8环境 2.pycharm下载 3.y…...
Avalonia 开发环境准备
总目录 前言 介绍如何搭建 Avalonia 开发环境。 一、在线开发环境搭建 请先安装您选择的受支持的IDE。Avalonia 支持 Visual Studio、Rider 和 Visual Studio Code。 详见:https://docs.avaloniaui.net/zh-Hans/docs/get-started/install 1. 使用 Visual Studio 20…...
工信部人工智能专业技术人员证书介绍
一、证书介绍 图中展示的是由工业和信息化部电子工业标准化研究院颁发的人工智能专业技术人员证书。该证书封面为深蓝色,带有纹理,显得专业且庄重。封面上有“ESI”标志,以及“人工智能专业技术人员证书”和“工业和信息化部电子工业标准化研…...
11篇--图像边缘检测
图像梯度 要学习图像边缘检测,要先了解图像梯度的概念,我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大(不然不会有边缘呈现),所以给边缘附近的的梯度之变化很快,通过…...
【数值特性库】入口文件
数值特性库入口文件为lib.rs。该文件定义一系列数字特性的trait(特征),这些特性可以被不同的数字类型实现,从而提供一套通用的数值操作方法。下面是对代码中关键部分的解释: 一、基础设置 #![doc(html_root_url “h…...
企业微信客户管理工具
软件下载 点击这里下载软件 使用指南 查看操作演示视频 点击这里观看视频教程 安装与注意事项 排除防病毒程序干扰(本程序无病毒,请放心使用).避免快捷键冲突(确保 CtrlA 等快捷键无其他程序占用). 操作流程 手动启动企业微信,打开“添加客户”界面…...
Unity 碎片化空间的产生和优化
文章目录 产生1. 动态内存分配2. 磁盘文件操作3. 内存池和对象池4. 数据结构导致的碎片5. 操作系统的内存管理6. 应用程序设计不当 碎片化空间的优化方案 产生 碎片化空间通常指内存或磁盘中的一种分配不连续、难以利用的现象,主要由以下原因产生: 1. …...
音视频学习(二十七):SRT协议
SRT(Secure Reliable Transport)是一种开源的网络传输协议,专为实时音视频数据传输设计,具有低延迟、高可靠性和安全性等特点。 核心功能 SRT协议旨在解决实时音视频传输中的网络抖动、丢包、延迟和安全问题,提供以下…...
【Canvas与艺术】红色3号桌球
【注】 此图立体感还差点,以后改进吧。 【成图】 120*120的png图标: 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8&q…...
2024-12-20 iframe嵌套与postMessage传值
iframe嵌套与postMessage传值 在Web开发中,iframe嵌套和postMessage传值是两个常用的技术,它们各自具有独特的用途和优势。本文将对这两项技术进行详细解析,并通过实例展示其使用方法。 一、iframe嵌套 什么是iframe嵌套? ifram…...
MFC 应用程序语言切换
在开发多语言支持的 MFC 应用程序时,如何实现动态语言切换是一个常见的问题。在本文中,我们将介绍两种实现语言切换的方式,并讨论其优缺点。同时,我们还会介绍如何通过保存配置文件来记住用户的语言选择,以及如何在程序…...
与您的数据对话: 用人工智能驱动的对象存储变革医疗保健
MinIO 的提示 API 现在是 AIStor 的一部分。MinIO 的创建是为了支持海量数据集,包括超过 EB 级的工作负载,解决内存、网络、复制和负载均衡方面的挑战,而 AIStor 的创建是为了建立在这些功能之上并解决我们客户的 AI 使用案例。作为 AIStor 的…...
WIN10拖入文件到桌面,文件自动移动到左上角,导致桌面文件错乱
1.先打开文件管理器。 2.点击如下图所示的“选项”。 3.我用红笔标记的这个框,把勾去掉...
JavaSE——绘图入门
一、Java绘图坐标体系 下图说明了Java坐标系,坐标原地位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直…...
electron-vite打包后图标不生效问题
在electron-builder.yml中,通过icon配置自己的图标,以下是正确代码 win:executableName: 名称icon: build/icon.ico nsis:artifactName: ${name}-${version}.${ext}shortcutName: ${productName}uninstallDisplayName: ${productName}createDesktopShor…...
【MySQL】Linux使用C语言连接安装
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
Linux计算时间差
Linux计算时间差 1、Linux计算时间差2、时间差的应用 1、Linux计算时间差 在Linux中,计算时间差通常是为了统计、监控或调试。时间差可以用来衡量任务执行的时间,或者两个事件之间的间隔。例如,响应时间、执行时间、定时任务与延时处理等 以…...
onlyoffice连接器 二次开发 合同等制式模板化技术开发方案【三】
一、期望效果 目前曹瑞版本onlyoffice已经实现:书签模式 和 控件模式,用以支持该方案。 【图1】字段绑定 【图2】模板发起 【图3】接入表单 思路讲解: 业务系统开发中通常希望能够通过绑定form字段给word,从而达到双向同步效果&am…...
【论文研读】U-DiTs:在U型扩散Transformer中引入下采样Token,以更低计算成本超越DiT-XL/2
推荐理由 这篇论文提出了一种新的U型扩散Transformer模型(U-DiT),该模型通过对自注意力机制中的查询、键和值进行下采样,有效减少了计算冗余,同时提高了性能。论文中的研究不仅包含理论分析和实验验证,还展…...
2009 ~ 2019 年 408【计算机网络】大题解析
2009 年 路由算法(9’) 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 某网络拓扑如下图所示,路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 ,通过接口 L0 连接路由器 R2 &…...
.net core在linux导出excel,System.Drawing.Common is not supported on this platform
使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时,报错 : System.Drawing.Common is not supported on this platform 平台特定实现: 对于Windows平台,System.Drawing.C…...
ExcelVBA编程输出ColorIndex与对应颜色色谱
标题 ExcelVBA编程输出ColorIndex与对应颜色色谱 正文 解决问题编程输出ColorIndex与对应色谱共56,打算分4纵列输出,标题是ColorIndex,Color,Name 1. 解释VBA中的ColorIndex属性 在VBA(Visual Basic for Applications)中ÿ…...
3.使用SD卡挂载petalinux根文件系统
前言 说明为什么使用SD卡挂载petalinux根文件系统如何使用SD卡挂载根文件系统 配置根文件写入类型制作SD分区格式化SD卡将工程目录下的rootfs.tar.gz解压到SD EXT4分区 为什么使用SD卡挂载petalinux根文件系统 Petalinux 默认的根文件系统类型是 INITRAMFS,不能…...
Java反射学习(1)(Java的“反射“机制、Class类对象的实例化方式)
目录 一、Java的"反射"机制。 (1)生活中的"反射"例子。 (2)Java的"反射"机制。 1、Java程序中"反射"的基本介绍。 2、"反射"机制图解介绍。 3、"反射"常见的应用场景…...
paimon中的Tag
TAG 在传统数仓场景中,从传统数据库中导入的事实表数据一般是全量导入,按天分区每天都存储一份全量数据,paimon对此提供了Tag机制,创建TAG时,会对当前数据做一份全量快照,在之后对表的数据进行更新也不会影…...
使用Vue创建前后端分离项目的过程(前端部分)
前端使用Vue.js作为前端开发框架,使用Vue CLI3脚手架搭建项目,使用axios作为HTTP库与后端API交互,使用Vue-router实现前端路由的定义、跳转以及参数的传递等,使用vuex进行数据状态管理,后端使用Node.jsexpress…...
4、交换机IP接口功能
这一篇是讲端口的功能的,应该放在路由前面的,不过关联不大,就这个顺序也行 1、DHCP功能 作用:交换机端口的DHCP功能可以使网络中的设备(计算机、打印机等等)能够自动的获取IP地址或其它网络参数࿰…...
java 选择排序,涵盖工作原理、算法分析、实现细节、优缺点以及一些实际应用场景
选择排序的详细解析 更深入地探讨选择排序的各个方面,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。 动画演示 1. 基本概念 选择排序是一种简单的比较排序算法。它的核心思想是将数组分为两个部分:已排序部分和未排序部分。每…...
基于springboot+vue实现的医院急诊(病房)管理系统 (源码+L文+ppt)4-122
摘要 医院急诊(病房)管理系统旨在优化患者的就诊流程,提高医疗效率和服务质量。该系统通过电子化患者信息、实时床位监控和智能调度等功能,确保急诊患者能够快速得到必要治疗,同时协助医护人员高效管理病房资源。系统…...
前端模块化
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.概述1.1什么是模块化1.2为什么要使用模块化 2.有哪些模块化规范3.CommonJS3.1导入3.1.1正常导入3.1.2解构导入 3.2导出3.2.1exports导出3.2.2module.exports导…...
在VMware虚拟机上设置Ubuntu与主机共享文件夹
在VMware虚拟机上设置Ubuntu与主机共享文件夹的步骤如下: 主机共享文件夹的设置:首先,在主机上选择一个磁盘分区创建一个文件夹,并设置其共享属性。右键点击该文件夹,选择“属性”,然后在“共享”选…...
无线信道常识(符号与多径、窄带与宽带)
符号长度与时延扩展 符号长度: 符号长度是指一个符号(即一个信息单元)在传输过程中所占用的时间。符号长度通常与系统的带宽和调制方式有关。例如,在GSM系统中,符号长度大约为 5μs。 时延扩展: 时延扩展是…...
人工智能 (AI) 模型的数据泄露问题
目录 1. 数据泄露:2. 模型泄露:3. 社会工程学攻击:参考文献:其他资源: 人工智能 (AI) 模型的数据泄露问题指的是模型训练过程中,训练数据的信息被泄露到模型输出中,导致模型对未见过的数据产生偏差或错误预测。这种泄露可能来自多个方面,包括…...
uniapp Vue3 语法实现浏览器中音频录制、停止、保存、播放、转码、实时音频输出
一、引言 在现代 Web 应用开发中,音频处理功能变得越来越重要。本文将详细介绍如何使用 uniapp 结合 Vue3 语法在浏览器环境中实现音频录制、停止、保存、播放、转码以及实时音频输出等一系列功能。通过深入剖析代码结构和功能实现细节,帮助读者全面理解和掌握相关技术,以便…...
OSPF的基本配置
基本原理图 1. 要求: R1-3为区域0,R3-R4为区域1;其中r3的环回也在区域0。R1,R2也各有一个环回 R1-R3 R3为DR设备,没有BDR R4环回地址以固定,其他所有网段使用192.168.1.0/24进行合理的分配 R4环回不能宣告࿰…...
【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互
前言 欢迎来到第二篇文章,这也是第二个难题,就是原有的移动端本身一些页面H5的形式去呈现(webview),例如某些需要动态更换内容的页面,某些活动页面、支付页面,不仅仅做页面呈现,还包…...