数据结构实验-互联网域名查询实验报告
- 格式:doc
- 大小:70.50 KB
- 文档页数:9
苏州科技学院数据结构(C语言版)实验报告专业班级测绘1011学号10201151姓名XX实习地点C1 机房指导教师史守正目录封面 (1)目录 (2)实验一线性表 (3)一、程序设计的基本思想,原理和算法描述 (3)二、源程序及注释(打包上传) (3)三、运行输出结果 (4)四、调试和运行程序过程中产生的问题及采取的措施 (6)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)实验二栈和队列 (7)一、程序设计的基本思想,原理和算法描述 (8)二、源程序及注释(打包上传) (8)三、运行输出结果 (8)四、调试和运行程序过程中产生的问题及采取的措施 (10)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)实验三树和二叉树 (11)一、程序设计的基本思想,原理和算法描述 (11)二、源程序及注释(打包上传) (12)三、运行输出结果 (12)四、调试和运行程序过程中产生的问题及采取的措施 (12)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)实验四图 (13)一、程序设计的基本思想,原理和算法描述 (13)二、源程序及注释(打包上传) (14)三、运行输出结果 (14)四、调试和运行程序过程中产生的问题及采取的措施 (15)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)实验五查找 (17)一、程序设计的基本思想,原理和算法描述 (17)二、源程序及注释(打包上传) (18)三、运行输出结果 (18)四、调试和运行程序过程中产生的问题及采取的措施 (19)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19)实验六排序 (20)一、程序设计的基本思想,原理和算法描述 (20)二、源程序及注释(打包上传) (21)三、运行输出结果 (21)四、调试和运行程序过程中产生的问题及采取的措施 (24)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24)实验一线性表一、程序设计的基本思想,原理和算法描述:程序的主要分为自定义函数、主函数。
数据结构实验实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。
学习基本的查找和排序技术。
让我们在实际上机中具有编制相当规模的程序的能力。
养成一种良好的程序设计风格。
实验教材:数据结构题集(C语言版)清华大学出版社2007年实验项目:实验一、栈和循环队列㈠、实验内容:①栈掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。
本程序采用的是链栈结构,具有初始化一个栈、PUSH、POP、显示所有栈里的元素四个功能。
②循环队列掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。
本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。
㈡、实验代码①栈程序代码:#include <stdio.h>#include <malloc.h>#define Stack_Size 6#define ERROR 0#define OK 1typedef int SElemType;typedef struct SNode{SElemType data;struct SNode *next;}SNode,*LinkStack;int CreatTwo(LinkStack &head,int n){int i;SNode *p;head=(LinkStack)malloc(sizeof(SNode));head->next=NULL;printf("请输入数据(数字):\n");for(i=n;i>0;--i){p=(SNode *)malloc(sizeof(SNode));scanf("%d",&p->data);p->next=head->next;head->next=p;}return 1;}int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}int Push(LinkStack &top,SElemType e){SNode *q;q=(LinkStack)malloc(sizeof(SNode));if(!q){printf("溢出!\n");return(ERROR);}q->data=e;q->next=top->next;top->next=q;return(OK);}int Pop(LinkStack &top,SElemType &e){SNode *q;if(!top->next){printf("error!\n");return(ERROR);}e=top->next->data;q=top->next;top->next=q->next;free(q);return(OK);}void main(){ int e;LinkStack top;printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n");while(1){switch(menu_select()){case 1:if(CreatTwo(top,Stack_Size))printf("Success!\n");break; case 2:printf("Push:\n");scanf("%d",&e);if(Push(top,e))printf("Success!\n");break;case 3:if(Pop(top,e))printf("Success!\n");printf("%d\n",e);break;case 4:LinkStack p;printf("所有栈里的元素:\n");p=top;while(p->next){p=p->next;printf("%7d",p->data);}printf("\n");break;case 5:return;}}}运行结果:②循环队列程序代码:#include<stdlib.h>#include<stdio.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define MAXSIZE 100typedef struct{int *elem;//队列存储空间int front;int rear;}SqQueue;//判断选择是否正确int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}//参数(传出)SqQueue &Q,循环队列(空)int InitQueue(SqQueue &Q){Q.elem=(int *)malloc(MAXSIZE*sizeof(int));if(!Q.elem)exit(OVERFLOW);Q.front=Q.rear=-1;for(int i=0;i<MAXSIZE;i++)Q.elem[i]=-1;return OK;}//返回Q的元素个数int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}//显示队列的元素void Display(SqQueue Q){for(int i=0;i<=QueueLength(Q);i++)if(Q.elem[i]!=-1)printf("%d ",Q.elem[i]);printf("\n");}//入队int EnQueue(SqQueue &Q,int e){Q.rear=(Q.rear+1)%MAXSIZE;if(Q.rear==Q.front)return ERROR;Q.elem[Q.rear]=e;return OK;}//出队int DeQueue(SqQueue &Q,int &e){if(Q.front==Q.rear)return ERROR;e=Q.elem[Q.front+1];Q.elem[Q.front+1]=-1;Q.front=(Q.front+1)%MAXSIZE;return OK;}void main(){SqQueue Q;InitQueue(Q);int elem,e;printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度:\n6.结束;\n");while(1){switch(menu_select()){case 1:printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);fflush(stdin);break;case 2:scanf("%d",&elem);EnQueue(Q,elem);printf("队列为:\n");Display(Q);fflush(stdin);break;case 3:DeQueue(Q,elem);printf("队列为:\n");Display(Q);break;case 4:printf("\n队列的所有元素:\n");Display(Q);break;case 5:printf("%d\n",QueueLength(Q));break;case 6:return;}}}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。
域名服务协议DNS实验七实验目的1. 掌握DNS的报文格式2. 掌握DNS的工作原理3. 掌握DNS域名空间的分类4. 理解DNS高速缓存的作用实验环境配置采用网络结构一实验原理一、DNS报文格式二、Internet域名空间的分类在Internet中,域名空间划分为三个部分:类属域、国家域和反向域。
1.类属域:按照主机的类属行为定义注册的主机。
类属域的顶级符号包括com、edu、gov、int、mil、net、org等。
2.国家域:按照国家定义注册的主机。
国家域的顶级符号包括cn、us、zw等。
3.反向域:把一个地址映射为名字。
三、DNS高速缓存当服务器向另一个服务器请求映射并收到它的响应时,它会在把结果发送给客户之前,把这个信息存储在它的DNS高速缓存中。
若同一客户或另一个客户请求同样的映射,它就检查高速缓存并解析这个问题。
高速缓存减少了查询时间,提高了效率。
实验步骤本实验将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组。
现仅以主机A和B为例,说明实验步骤。
按照拓扑结构图连接网络,使用拓扑验证检查连接的正确性。
练习一:Internet域名空间的分类1.类属域2.将主机A、B的“首选DNS服务器”设置为公网DNS服务器,目的是能够访问因特网。
3.①主机B启动协议分析器开始捕获数据并设置过滤条件(提取DNS协议)。
4.②主机A在命令行下运行“nslookup”命令。
5.6.③主机B停止捕获数据。
分析主机B捕获到的数据及主机A命令行返回的结果,回答以下问题:“”对应的的IP地址是什么?对应的IP地址为:103.245.222.223“”域名的顶级域名的含义是什么?顶级域名org:表示非营利性组织7.国家域8.①主机B启动协议分析器开始捕获数据并设置过滤条件(提取DNS协议)。
9.②主机A在命令行下运行“nslookup ”命令。
③主机B停止捕获数据。
分析主机B捕获到的数据及主机A命令行返回的结果,回答以下问题:“” 对应的的IP地址是什么?222.168.72.196“”域名的顶级、二级、三级域名的含义是什么?一级cn:中国国家域名二级gov:政府三级jl:表示吉林省10.反向域11.①将主机A、B的“首选DNS服务器”设置为服务器的IP地址(172.16.0.10)。
(2023)常用网络命令实验实训报告(一)常用网络命令实验实训报告实验介绍本实验是网络技术相关实验之一,旨在通过学习常用网络命令,加深对网络原理的理解。
实验内容实验内容主要包括以下几个方面: - IP地址查询 - 端口扫描 - 路由跟踪 - 网络连通性测试 - DNS解析实验步骤1.IP地址查询使用命令ipconfig或者ifconfig查询本机IP地址,并验证其正确性。
2.端口扫描使用命令nmap进行端口扫描,并查看扫描结果。
也可以使用telnet或者netcat等命令进行端口测试。
3.路由跟踪使用命令traceroute或tracert进行路由跟踪,并查看跟踪结果。
可以用于定位网络故障问题。
4.网络连通性测试使用命令ping或者curl等命令进行网络连通性测试。
可以验证网络是否正常连接。
5.DNS解析使用命令nslookup对域名进行解析,并查看解析结果。
可以了解DNS的工作原理。
实验心得通过本次实验,我更深入地了解了网络命令的使用,以及网络原理的相关知识。
同时,本次实验也对我今后的网络学习和工作有很大的帮助。
总结网络技术是现代化社会的重要组成部分,学习网络命令对于我们掌握网络相关技术非常重要。
希望通过本次实验,大家都能对网络命令有更深刻的认识,能够更好地应用于实际学习和工作中。
一些常用命令举例本节列举一些常用的网络命令,供参考。
- ping:测试网络连通性 - nslookup:解析域名 - traceroute或tracert:路由跟踪 - nmap:端口扫描 - ifconfig或ipconfig:查询本机IP地址 - netstat:显示网络状态 - wget:下载文件 - curl:获取网页内容 - telnet:测试端口是否开放 - tcpdump:抓包分析实验结论通过本次实验,我们可以发现,网络命令的使用非常广泛,可以帮助我们快速地诊断和解决网络故障问题。
同时,理解网络命令背后的原理,对我们学习和应用网络技术也有很大的帮助。
2011~2012第一学期数据结构实验报告班级:信管一班学号:201051018姓名:史孟晨实验报告题目及要求一、实验题目设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。
1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统),输出实验结果。
(15分)2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学生的学号、姓名和成绩。
3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。
二、实验要求1.修改算法。
将奇偶排序算法升序改为降序。
(15分)2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。
(45分))3.编译、链接以上算法,按要求写出实验报告(25)。
4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。
5.用A4纸打印输出实验报告。
三、实验报告说明实验数据可自定义,每种排序算法数据要求均不重复。
(1) 实验题目:《N门课程学生成绩名次排序算法实现》;(2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性;(3) 实验要求:对算法进行上机编译、链接、运行;(4) 实验环境(Windows XP-sp3,Visual c++);(5) 实验算法(给出四种排序算法修改后的全部清单);(6) 实验结果(四种排序算法模拟运行后的实验结果);(7) 实验体会(文字说明本实验成功或不足之处)。
三、实验源程序(算法)Score.c#include "stdio.h"#include "string.h"#define M 6#define N 3struct student{ char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M];void changesort(struct student a[],int n,int j){int flag=1,i;struct student temp;while(flag){ flag=0;for(i=1;i<n-1;i+=2) /*对所有奇数项进行一遍比较*/ if (a[i].score[j]>a[i+1].score[j]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}for(i=0;i<n-1;i+=2) /*对所有偶数项进行一遍比较*/if (a[i].score[j]>a[i+1].score[j]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}void print_score(struct student a[],int n,int j){ int i,k;printf(“ 奇偶交换成绩 %d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){ if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;p rintf(" %4d ",k);p rintf("%4d",a[i].number);p rintf(" %s",a[i].name);p rintf(" %6d",a[i].score[j]);p rintf("\n");}}main(){ int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{ printf("请输入第 %d 名学生分数: ",i+1);printf("\n"); printf("姓名: ");s canf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{ stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];}changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n"); k=1;for(i=0;i<M;i++){ if(i>0&&stu[i].score[N]!=stu[i-1].score[N])k++;printf("%4d",k);printf(" %4d",stu[i].number);printf(" %s",stu[i].name);for(j=0;j<N+1;j++)printf(" %6d",stu[i].score[j]);printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前 3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前 3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前 3 名同学成绩*/}源代码结果:请输入第1 名学生分数: 姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数: 姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第 3 名学生分数: 姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数: 姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数: 姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数: 姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 5 张一析78 68 91 2372 2 袁欣78 80 92 2503 4 滕芷79 84 88 2514 6 白晓彤88 76 90 2545 1 史孟晨87 90 78 2556 3 赵宇88 76 95 259 奇偶交换成绩1 排序表名次学号姓名分数1 5 张一析781 2 袁欣782 4 滕芷793 1 史孟晨87奇偶交换成绩2 排序表名次学号姓名分数1 5 张一析682 6 白晓彤762 3 赵宇763 2 袁欣80奇偶交换成绩3 排序表名次学号姓名分数1 1 史孟晨782 4 滕芷883 6 白晓彤90Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int flag=1,i;struct student temp;while(flag){flag=0;for(i=1;i<n-1;i+=2) /*对所有奇数项进行一遍比较*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}for(i=0;i<n-1;i+=2) /*对所有偶数项进行一遍比较*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 奇偶交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}升序改降序:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 奇偶交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79奇偶交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80 奇偶交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int flag=1,i,m,k;struct student temp;while(flag){flag=0;for(i=0;i<n-1;i++) /*选择排序法*/{k=i;for(m=i+1;m<n;m++)if (a[m].score[j]>a[k].score[j]){k=m;temp=a[i];a[i]=a[k];a[k]=temp;flag=1;}}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 选择交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}简单选择:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 选择交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79选择交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80 选择交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){{int flag=1,i;struct student temp;while(flag){flag=0;for(i=0;i<n;i++) /*冒泡排序法*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 冒泡交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}运行结果:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 冒泡交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79冒泡交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80冒泡交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continueJusertsort.c#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];}changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int i, m;struct student temp;/*插入排序法*/for(i=1; i<n; i++){temp = a[i];for(m=i; m>0 && temp.score[j] > a[m-1].score[j]; m--){a[m] = a[m-1];}a[m] = temp;}}void print_score(struct student a[],int n,int j){int i,k;printf(" 插入交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 插入交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79插入交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80插入交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91Press any key to continue心得体会本学期开设的《数据结构基础》课程已经告一段落,现就学习体会进行学习总结.这是一门纯属于设计的科目,它需用把理论变为上机调试。
实验DNS 协议分析 实验步骤1.打开wireshark ,设置好过滤器。
2.在命令提示符后键入nslookup .wireshark 捕获dns 的数据包。
结果如下: 表示本地域名服务器的名字;219.229.240.19表示本地域名服务器的IP 地址 表示 的真实域名;119.75.217.56和119.75.218.45为百度的IP 地址;3.设置好过滤器后按enter 键,开始抓包.4. 分析wireshark捕获的数据包.分析前四帧:首先通过反向查询获得本地DNS 服务器的域名域名,其次通过正向查询获得查询域名的IP 地址:4.具体分析捕获的数据包的DNS 报文格式:第一帧是192.168.1.102发送给本地DNS 服务器219.229.240.19的反向查询取得报文,用于获得本地DNS 服务器的名字。
具体协议说明如下:前两帧:通过反向查询获得本地DNS 服务器的名字 后两帧:通过正向查询获得查询域名对应的IP 地址帧数应用层存活时间网络层递归请求版本,表示的是 IP 規格版本标头长度识别码封包总长 。
通常以 byte 做单位來表示该封包的总长度,此数值包括标头和数据的总和。
第二帧是本地DNS服务器返回的响应帧,包含查询结果,即本地DNS 服务器的名字:存活时间反向查询的域名,即查询结果权威DNS本地服务器的域名第三帧是客户端发过给本地DNS服务器的DNS请求报文,用于请求对应的IP 地址请求的资源记录RR第四帧是本地DNS服务器发给客户端的响应报文,包含了对应的真正的域名和IP地址.是对应的真正域名,也是的最初的名字对应的IP是119.75.217.56和119.75.218.45。
大学计算机Internet实验报告实验名称:大学计算机Internet实验报告实验目的:本实验旨在通过实际操作,加深对计算机Internet的理解,掌握Internet的基本原理和相关技术。
实验装置:1. 一台联网的个人电脑2. 一个浏览器(如谷歌浏览器、火狐浏览器等)3. 一个文本编辑器(如记事本、Sublime Text等)实验步骤:1. 查找相关资料和理论知识在进行实验前,我们先查找相关资料和理论知识,对Internet的基本原理、协议等有所了解,以便更好地理解实验过程和结果。
2. 实验环境准备确保个人电脑正常联网,并打开浏览器,确保浏览器的设置无误,能够正常访问互联网。
3. 访问网页通过浏览器访问指定网页,了解网页的结构、功能和所使用的技术。
可以对网页源代码进行查看,进一步理解网页的构成和语法。
4. 下载文件选择一个合适的网站,下载一个文件到本地。
观察文件下载的过程,了解HTTP协议和下载过程中的一些细节。
5. 发送电子邮件使用电子邮件客户端(如Outlook、网页邮箱等),发送一封电子邮件给某个收件人。
观察邮件的传送和接收过程,了解SMTP和POP3等协议的作用。
实验结果与分析:通过以上的实验步骤,我们对计算机Internet的基本原理和相关技术有了一定的了解和体验。
具体的实验结果如下:1. 访问网页:通过浏览器访问指定的网页,我们成功打开了网页,观察到了网页的结构和功能。
同时,我们还查看了网页的源代码,进一步了解了网页的构成和语法。
2. 下载文件:选择了一个合适的网站,成功下载了一个文件到本地。
在下载的过程中,我们发现浏览器使用HTTP协议进行文件传输,通过下载链接下载文件的过程可以分为请求和响应两个阶段。
3. 发送电子邮件:使用电子邮件客户端,成功发送了一封电子邮件。
我们通过观察邮件的传送和接收过程,了解了SMTP协议用于发送邮件,而POP3协议用于接收邮件。
结论:通过本次实验,我们对计算机Internet的基本原理和相关技术有了更深入的了解。
班级:姓名:学号:实验一线性表的基本操作一、实验目的1、掌握线性表的定义;2、掌握线性表的基本操作;如建立、查找、插入和删除等..二、实验内容定义一个包含学生信息学号;姓名;成绩的顺序表和链表二选一;使其具有如下功能:1 根据指定学生个数;逐个输入学生信息;2 逐个显示学生表中所有学生的相关信息;3 根据姓名进行查找;返回此学生的学号和成绩;4 根据指定的位置可返回相应的学生信息学号;姓名;成绩;5 给定一个学生信息;插入到表中指定的位置;6 删除指定位置的学生记录;7 统计表中学生个数..三、实验环境Visual C++四、程序分析与实验结果#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; // 定义函数返回值类型typedef struct{char num10; // 学号char name20; // 姓名double grade; // 成绩}student;typedef student ElemType;typedef struct LNode{ElemType data; // 数据域struct LNode *next; //指针域}LNode;*LinkList;Status InitListLinkList &L // 构造空链表L {L=struct LNode*mallocsizeofstruct LNode; L->next=NULL;return OK;}Status GetElemLinkList L;int i;ElemType &e // 访问链表;找到i位置的数据域;返回给 e{LinkList p;p=L->next;int j=1;whilep&&j<i{p=p->next;++j;}ifp||j>i return ERROR;e=p->data;return OK;}Status SearchLNode L;char str;LinkList &p // 根据名字查找{p=L.next;whilep{ifstrcmpp->;str==0return OK;p=p->next;}return ERROR;}Status ListInsertLinkList L;int i;ElemType e // 在i个位置插入某个学生的信息{LinkList p;s;p=L;int j=0;whilep&&j<i-1{p=p->next;++j;}ifp||j>i-1 return ERROR;s=struct LNode*mallocsizeofLNode;s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDeleteLinkList p;int i // 删除i位置的学生信息{int j=0;whilep->next&&j<i-1{p=p->next;++j;}ifp->next||j>i-1 return ERROR;LinkList q;q=p->next;p->next=q->next;delete q;return OK;}void InputElemType *e{printf"姓名:"; scanf"%s";e->name;printf"学号:"; scanf"%s";e->num;printf"成绩:"; scanf"%lf";&e->grade;printf"输入完成\n\n";}void OutputElemType *e{printf"姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n";e->name;e->num;e->grade;}int main{LNode L;LinkList p;ElemType a;b;c;d;printf"\n********************************\n\n";puts"1. 构造链表";puts"2. 录入学生信息";puts"3. 显示学生信息";puts"4. 输入姓名;查找该学生";puts"5. 显示某位置该学生信息";puts"6. 在指定位置插入学生信息";puts"7. 在指定位置删除学生信息";puts"8. 统计学生个数";puts"0. 退出";printf"\n********************************\n\n"; int x;choose=-1;whilechoose=0{puts"请选择:";scanf"%d";&choose;switchchoose{case 1:ifInitListpprintf"成功建立链表\n\n";elseprintf"链表建立失败\n\n";break;case 2:printf"请输入要录入学生信息的人数:";scanf"%d";&x;forint i=1;i<=x;i++{printf"第%d个学生:\n";i;Input&a;ListInsert&L;i;a;}break;case 3:forint i=1;i<=x;i++{GetElem&L;i;b;Output&b;}break;case 4:char s20;printf"请输入要查找的学生姓名:";scanf"%s";s;ifSearchL;s;pOutput&p->data;elseputs"对不起;查无此人";puts"";break;case 5:printf"请输入要查询的位置:";int id1;scanf"%d";&id1;GetElem&L;id1;c;Output&c;break;case 6:printf "请输入要插入的位置:";int id2;scanf"%d";&id2;printf"请输入学生信息:\n";Input&d;ifListInsert&L;id2;d{x++;puts"插入成功";puts"";}else{puts"插入失败";puts"";}break;case 7:printf"请输入要删除的位置:";int id3;scanf"%d";&id3;ifListDelete&L;id3{x--;puts"删除成功";puts"";}else{puts"删除失败";puts"";}break;case 8:printf"已录入的学生个数为:%d\n\n";x;break;}}printf"\n\n谢谢您的使用;请按任意键退出\n\n\n"; system"pause";return 0;}用户界面:(1)根据指定学生个数;逐个输入学生信息:(2)逐个显示学生表中所有学生的相关信息:(3)根据姓名进行查找;返回此学生的学号和成绩:(4)根据指定的位置可返回相应的学生信息学号;姓名;成绩:(5)给定一个学生信息;插入到表中指定的位置:(6)删除指定位置的学生记录:(7)统计表中学生个数:五、实验总结数据结构是一门专业技术基础课..它要求学会分析研究计算机加工的数据结构的特性;以便为应用涉及的数据选择适当的逻辑结构;存储结构及相应的算法;并初步掌握算法的时间分析和空间分析技术..不仅要考虑具体实现哪些功能;同时还要考虑如何布局;这次的实验题目是根据我们的课本学习进程出的;说实话;我并没有真正的读懂书本的知识;所以刚开始的时候;感到很棘手;于是又重新细读课本;这一方面又加强了对书本的理解;在这上面花费了一些心血;觉得它并不简单;是需要花大量时间来编写的....在本次实验中;在程序构思及设计方面有了较大的锻炼;能力得到了一定的提高..。
dns协议分析实验报告DNS 协议分析实验报告一、实验目的本次实验旨在深入理解 DNS(Domain Name System,域名系统)协议的工作原理、消息格式以及其在网络通信中的重要作用。
通过实际的抓包分析和实验操作,掌握 DNS 协议的查询和响应过程,了解 DNS 缓存机制、域名解析的流程,并对常见的 DNS 问题进行分析和解决。
二、实验环境1、操作系统:Windows 102、抓包工具:Wireshark3、网络环境:校园网三、实验原理1、 DNS 基本概念域名:如,是便于人们记忆和使用的网站名称。
IP 地址:如 19216801,是网络中设备的实际地址。
DNS 服务器:存储域名与 IP 地址对应关系的服务器。
2、 DNS 工作流程客户端向本地 DNS 服务器发送域名查询请求。
本地 DNS 服务器若没有缓存相应的记录,会向根 DNS 服务器、顶级 DNS 服务器等进行递归或迭代查询。
最终获取到 IP 地址后,返回给客户端,并在本地进行缓存。
3、 DNS 消息格式DNS 消息由头部和正文两部分组成。
头部包含标识、标志、问题数量、资源记录数量等字段。
正文包含查询问题、回答资源记录、授权资源记录和额外资源记录等部分。
四、实验步骤(一)安装和配置 Wireshark1、从官方网站下载 Wireshark 安装包,并按照提示进行安装。
2、打开 Wireshark,选择合适的网络接口进行抓包。
(二)进行 DNS 查询1、在命令提示符中,使用`nslookup` 命令查询一个域名,如`nslookup `。
2、同时在 Wireshark 中开始捕获数据包。
(三)分析 DNS 数据包1、在 Wireshark 中,筛选出 DNS 协议的数据包。
2、查看 DNS 数据包的头部信息,包括标识、标志、问题数量等。
3、分析查询问题部分,包括域名、查询类型(如 A 记录、MX 记录等)。
4、查看回答资源记录,获取域名对应的 IP 地址等信息。
陕西师范大学计算机网络实验报告实验四 DNS一、实验目的1.熟悉并掌握 wireshark的操作。
2.分析DNS协议。
二、实验器材1.PC机电脑一台。
2.下载wireshark软件并安装三、实验内容及问题回答1.练习使用nslookup程序发送DNS查询1. Run nslookup to obtain the IP address of a Web server in Asia.2. Run nslookup to determine the authoritative DNS servers for a university in Europe.3. Run nslookup so that one of the DNS servers obtained in Question 2 is queried for the mail servers for Yahoo! Mail 德国德累斯顿工业大学2.练习使用ipconfig (1)ipconfig/all(2).Ipconfig/displaydns(3).ipconfig/flushdns清除缓存3. Tracing DNS with Wireshark实验1过程:1.使用ipconfig清空DNS缓冲存储;2.清空浏览器的缓存;3.启动Wireshark,在filter中输入“ip.addr==10.2.136.26”;4.开始抓包;5.访问;6.页面打开后,停止抓包。
4. Locate the DNS query and response messages. Are they sent over UDP or TCP?答:用的是UDP5. What is the destination port for the DNS query message? What is the source port of DNS response message?答:Src Port :domain(53), Dst Port: domain(53)6. To what IP address is the DNS query message sent? Use ipconfig to determine the IP address of your local DNS server. Are these two IP addresses the same?答:Destination:202.117.144..2(202.117.144.2) 与用本地DNS 服务器的IP 地址相同。
计算机网络实验报告专业:计算机科学与技术年级:班级:姓名:学号:计算机科学学院DNS协议分析1.运行nslookup,查询并记载你的本地DNS 服务器名称及其IP 地址, 的权威DNS 服务器名称及其IP 地址;(1)本地DNS 服务器名称及其IP 地址(2) 的权威DNS 服务器名称及其IP 地址2.运行nslookup,查询并记载 的IP 地址、其权威DNS 服务器名称和IP 地址。
(1) 的IP 地址(2)权威DNS 服务器名称和IP地址3.已知剑桥大学的域名为,运行nslookup,查询并记载剑桥大学的IP 地址和他的权威DNS 服务器名称和IP 地址;(1)剑桥大学的IP 地址(2)他的权威DNS 服务器名称和IP 地址4.运行ipconfig/all,查询并记载你的本地DNS 服务器,看和nslookup 显示的有无差别,如有差别差在哪里?为什么?有差别5.运行ipconfig/all,查询并记载你的网卡名称、IP 地址、掩码、网关、MAC 地址和主机名称;6. 运行ipconfig/all,查询并记载你当前是否使用了DHCP 功能?是7. Locate the DNS query and response messages. Are they sent over UDP or TCP? Answer: UDP .8. What is the destination port for the DNS query message? What is the source port of DNS response message?Query message :Response message:9. To what IP address is the DNS query message sent? Use ipconfig to determine the IP address of your local DNS server. Are these two IP addresses the same?Answer:202.117.144.2相同:ipconfig:10. Examine the DNS query message. What “Type” of DNS query is it? Does the query message contain any “answers”?Answer:没有,11. Examine the DNS response message. How many “answers” are provided? What does each of these answers contain?Answer: 1个12. Consider the subsequent TCP SYN packet sent by your host. Does the destination IP address of the SYN packet correspond to any of the IP addresses provided inthe DNS response message?Answer:the destination IP address of the SYN packet:the IP addresses provided in the DNS response message:相同。
实验序号:1 实验项目名称:IP地址与域名服务实验地点:206 实验时间:一、实验目的及要求1、理解IP地址的用途及子网掩码的作用2、理解IP地址与域名的关系3、了解域名服务器的工作原理二、实验所需设备计算机、局域网、互联网三、实验内容与步骤1、设置本机IP地址为192.168.0.X,观察子网掩码的变化2、任意设置本机IP,测试能否连上Internet3、任意设置DNS服务器的IP,测试能否打开网页4、在网络上搜索门户网站的IP,然后在浏览器地址栏中输入,观察能否打开相应主页四、实验结果与数据处理1、当本机IP 为192.168.0.X时,子网掩码为255.255.255.0,表示这是一个C类IP2、任意设置的IP,本机无法连上Internet,因为子网号不符3、任意的DNS服务器,无法打开网页,因为无法解析域名4、输入相应IP,可以打开主页,IP和域名的本质是一样的实验序号:2 实验项目名称:IIS的安装实验地点:206 实验时间:一、实验目的及要求1、了解WWW服务的基本工作概念工作原理2、安装WWW服务器3、配置与管理WWW服务器二、实验所需设备计算机、局域网、互联网、IIS安装包三、实验内容与步骤1、运行“控制面板”中的“添加或删除程序”,点击“添加/删除Windows组件”按钮。
步骤二,在出现组件安装向导中,选择“Internet信息服务(IIS)”,单击“下一步”开始安装,单击“完成”结束2、系统自动安装组件,完成安装后,系统在“开始”/“程序”/“管理工具”程序组中会添加一项“Internet服务管理器”,此时服务器的WWW、FTP等服务会自动启动。
3、通过“开始”/“程序”/“管理工具”/“Internet服务管理器”,打开“Internet信息服务窗口”,在所管理的站点上,单击鼠标右键执行“属性”命令,进入该站点的“属性”对话框。
4、在Web站点的属性页上主要设置标识参数、连接、启用日志记录,主要有以下内容:在“说明”文本框中输入对该站点的说明文字,用它表示站点名称。
dns实验报告DNS实验报告一、引言DNS(Domain Name System)是互联网中用于将域名转换为IP地址的系统,它是互联网的基础设施之一。
本实验旨在通过对DNS的实验研究,深入了解DNS的工作原理、解析过程以及可能存在的问题。
二、实验目的1. 了解DNS的基本概念和工作原理;2. 掌握DNS解析过程及其相关协议;3. 分析DNS可能存在的问题,并提出改进方案。
三、实验方法本实验采用以下方法进行研究:1. 查阅相关文献和资料,了解DNS的基本原理;2. 搭建实验环境,使用工具进行DNS解析实验;3. 分析实验数据,总结实验结果。
四、DNS的基本原理DNS的基本原理是将用户输入的域名转换为对应的IP地址。
它通过域名服务器来实现这一功能。
当用户在浏览器中输入一个域名时,浏览器会向本地DNS服务器发送一个查询请求,本地DNS服务器会根据自身的缓存情况来判断是否需要向上级DNS服务器发送查询请求。
最终,用户的请求会逐级向上查询,直到找到对应的IP地址。
五、DNS解析过程1. 用户输入域名,浏览器向本地DNS服务器发送查询请求;2. 本地DNS服务器查询自身的缓存,如果有对应的IP地址,则返回给浏览器;3. 如果本地DNS服务器没有缓存,它会向根域名服务器发送查询请求;4. 根域名服务器返回顶级域名服务器的IP地址;5. 本地DNS服务器再次向顶级域名服务器发送查询请求;6. 顶级域名服务器返回次级域名服务器的IP地址;7. 本地DNS服务器继续向次级域名服务器发送查询请求,直到找到对应的IP地址;8. 本地DNS服务器将查询结果返回给浏览器。
六、实验结果通过实验,我们获得了一些有关DNS解析的实验结果。
我们发现,DNS解析的速度受到多个因素的影响,包括网络延迟、DNS服务器的响应速度以及缓存的情况等。
在实验中,我们发现当本地DNS服务器的缓存命中率较高时,DNS解析的速度明显提高。
同时,我们还发现某些DNS服务器的响应速度较慢,导致整个解析过程变慢。
计算机网络课程设计DNS服务器实验报告(共5篇)第一篇:计算机网络课程设计 DNS 服务器实验报告DNS中继服务器实验报告07415林珅(13)071401 07415刘磊(18)071406 07415李鸿(19)071407一、系统概述1)运行环境:windows XP2)编译:Microsoft visual C++ 6.0 3)使用方法:a)使用ipconfig/all,记下当前DNS服务器,例如为211.68.71.4b)使用下页的配置界面,将DNS设置为127.0.0.1(本地主机)c)运行你的dnsrelay程序(在你的程序中把外部dns服务器设为前面记下的211.68.71.4)d)正常使用ping,ftp,IE等,名字解析工作正常二、系统的功能设计设计一个DNS服务器程序,读入“域名-IP地址”对照表,当客户端查询域名对应的IP地址时,用域名检索该对照表,三种检索结果:1)检索结果为ip地址0.0.0.0,则向客户端返回“域名不存在”的报错消息(不良网站拦截功能)2)检索结果为普通IP地址,则向客户返回这个地址(服务器功能)3)表中未检到该域名,则向因特网DNS服务器发出查询,并将结果返给客户端(中继功能)•考虑多个计算机上的客户端会同时查询,需要进行消息ID的转换三、模块划分DNS服务器主模块包含三个子模块,分别如下:1)命令行参数处理模块:该模块用来处理通过命令行提示符来启动这个DNS服务器时所输入的命令行参数,管理员通过设置不同的参数可以使DNS服务器显示不同程度的提示和调试信息。
所以这模块主要是依照输入的参数设置标志数据,以控制最后的各种信息的输出。
2)本地解析模块:本模块是在本DNS服务器本地保存的曾经解析过的或者需要屏蔽额域名和其对应IP信息文件中查找从应用程序来的请求解析的域名,在这个文件中查到需要的域名后取出对应的IP地址,并构造DNS应答数据包返回给发送此DNS域名解析请求的应用程序。
实 验 报 告 实验课程:数 据 结 构 实验项目:实验三互联网域名查询 专 业:计算机科学与技术 班 级: 姓 名: 学 号: 指导教师: 目 录 一、问题定义及需求分析 (1)问题描述 (2)实验任务 (3)需求分析
二、概要设计: (1)抽象数据类型定义 (2)主程序流程 (3) 模块关系
三、详细设计 (1)数据类型及存储结构 (2)模块设计
四、调试分析 (1)调试分析 (2)算法时空分析 (3)经验体会
五、使用说明 (1)程序使用说明 六、测试结果 (1)运行测试结果截图 七、附录 (1)源代码 一、问题定义及需求分析 (1)实验目的 互联网域名查询 互联网域名系统是一个典型的树形层次结构。从根节点往下的第一层是顶层域,如cn、com等,最底层(第四层)是叶子结点,如www等。因此,域名搜索可以看成是树的遍历问题。 (2)实验任务 设计搜索互联网域名的程序。 (3)需求分析: 1)采用树的孩子兄弟链表等存储结构。 2)创建树形结构。 3)通过深度优先遍历搜索。 4)通过层次优先遍历搜索。
二、概要设计: 采用孩子兄弟链表存储结构完成二叉树的创建; 主程序流程: 创建根节点 域名输入 域名拆分 根据孩子兄弟链表表示的树进行插入 调用层次优先遍历 输出遍历结果 调用深度优先遍历 输出遍历结果 结束程序 模块关系: 输入域名
创建孩子兄弟树 层次优先遍历输出结果 深度优先遍历输出结果 结束 三、详细设计 孩子兄弟链表结构: typedef struct CSNode{ ElemType data[10]; struct CSNode *firstchild, *nextsibling; }*CSTree; 模块一深度优先遍历 算法如下 void DFS(CSNode *root) { if (!root) return;//递归结束条件 printf("%s\n", root->data); DFS(root->firstchild);//递归遍历孩子节点 DFS(root->nextsibling);//递归遍历兄弟节点 } 模块二层次优先遍历 算法如下 void BFS(CSNode *root) { printf("层次优先搜索遍历结果为:\n"); Queue que; que.Clear(); que.push(root);//根节点入队列 while (!que.empty()) {//队列不空的时候执行循环 CSNode *xx = que.front(); //取队首元素 que.pop();//出队列 printf("%s\n", xx->data); if (xx->nextsibling) {//出队节点的孩子节点若不空则入队列 que.push(xx->nextsibling); } if (xx->firstchild) {//同样若孩子节点不空则入队列 que.push(xx->firstchild); } } }
四、调试分析 问题解决: 在编写层次优先遍历算法的时候遍历结果总是不正确,原因是取完队首元素后没有将出队列,经过改正,在取队首元素后加上出队列函数将队首元素出队;这样便解决了问题; 时空分析:经过孩子兄弟链表表示的树创建后便得到一棵二叉树;对于两个遍历函数,深度优先遍历是递归算法,在时间上,递归算法效率较低,尤其是运算次数较大的时候;层次优先遍历函数借助到队列,所以在内存占用上较多;而深度优先遍历算法的空间占用上更优于层次优先遍历; 经验体会: 孩子兄弟链表表示的树与二叉树可以相互转化;它的深度优先遍历递归算法虽较为简单但相比非递归算法而言效率不高。
五、使用说明 第一步:输入域名 第二步:完成创建 第三步:输出层次优先遍历结果 第四步:输出深度有限遍历结果
六、测试截屏
七、附录 #include #include #include #define ElemType char #define QueueSize 50 #define push Push #define empty Empty #define pop Pop #define front Front typedef struct CSNode{ ElemType data[10]; struct CSNode *firstchild, *nextsibling; }*CSTree;//节点结构
void InitTree(CSNode *A) { //构造一个空树 A = (CSTree)malloc(sizeof(CSNode)); A->firstchild = A->nextsibling = NULL; } int Search_(CSNode *X, char *a) { //查找待插入的节点在树中是否存在 CSNode *B; B = X;//B指向根节点 while (B->data) { if (strcmp(B->data, a) == 0) { X = B; //若存在相等的则返回1 return 1; } else { B = B->nextsibling; //否则B指向它的兄弟节点 } } return 0; }
void hanshu1(CSNode *A, ElemType *s) {//将节点插入到树中 CSNode *B, *X; char *str; int i; X = A; //X指向根节点 B = (CSTree)malloc(sizeof(CSNode)); B->firstchild = B->nextsibling = NULL; char ZhongZhuan[15]; //中转数组
for (; s != '\0';) { //zhongzhuan接受s中xxx.部分或取完翻转zhongzhuan str = strchr(s, '.');//返回字符串s中第一次出现点的位置 if (str) { i = str - s; ZhongZhuan[i + 1] = '\0'; for (; i >= 0; i--, s++) { ZhongZhuan[i] = s[0];//将拆分后的节点传入中转数组中 } } else {//字符串中不含点符号 _strrev(s); i = strlen(s); ZhongZhuan[i + 1] = '\0'; for (; i >= 0; i--) { ZhongZhuan[i] = s[i];//将字符串存入中转数组里 } s = '\0'; }
if (Search_(X, ZhongZhuan)) {//若要插入的字符串已存在该层面上 X = X->firstchild;//x指向孩子节点 continue; } if (X->data[0] == '0') { strcpy(X->data, ZhongZhuan);//将中转数组的信息复制给待插入节点 B = (CSTree)malloc(sizeof(CSNode)); B->firstchild = B->nextsibling = NULL; } else { if (X->firstchild) { strcpy(B->data, ZhongZhuan); X->nextsibling = B;//将B作为X的兄弟节点 B = (CSTree)malloc(sizeof(CSNode)); B->firstchild = B->nextsibling = NULL; X = X->nextsibling; //x指向它的兄弟节点 } else { strcpy(B->data, ZhongZhuan); X->firstchild = B; B = (CSTree)malloc(sizeof(CSNode)); B->firstchild = B->nextsibling = NULL; X = X->firstchild; } } } } struct Queue { int Top, Tail; CSNode *a[1000]; void Clear(); void Push(CSNode *e); void Pop(); CSNode *Front(); bool Empty(); };//队列封装为结构体
void Queue::Clear() { Top = Tail = 0; return; }//清空队列
void Queue::Push(CSNode *e) { a[Tail++] = e; return; }//入队列
void Queue::Pop() { Top++; return; }//出队列
CSNode *Queue::Front() { return a[Top]; }//取队首元素
bool Queue::Empty() { return Top == Tail; }//判空
void BFS(CSNode *root) { printf("层次优先搜索遍历结果为:\n"); Queue que; que.Clear(); que.push(root);//根节点入队列 while (!que.empty()) {//队列不空的时候执行循环 CSNode *xx = que.front(); //取队首元素 que.pop();//出队列 printf("%s\n", xx->data); if (xx->nextsibling) {//出队节点的孩子节点若不空则入队列 que.push(xx->nextsibling);