教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 法律文档 >

DNS课程设计报告

来源:网络收集 时间:2026-07-16
导读: DNS 服务器程序 实验报告 班级:2011211301 小组成员:曹晓欢 2011211139 杨静怡 2011211140 系统功能设计 设计一个DNS服务器程序,读入“IP地址-域名”对照表,当客户端查询域名对应的IP地址时,用域名检索该对照表,有三种可能检索结果: 检索结果:ip地址

DNS 服务器程序

实验报告

班级:2011211301

小组成员:曹晓欢 2011211139

杨静怡 2011211140

系统功能设计

设计一个DNS服务器程序,读入“IP地址-域名”对照表,当客户端查询域名对应的IP地址时,用域名检索该对照表,有三种可能检索结果:

检索结果:ip地址0.0.0.0,则向客户端返回“域名不存在”的报错消息(不良网站拦截功能)

检索结果:普通IP地址,则向客户端返回该地址(服务器功能) 表中未检到该域名,则向因特网DNS服务器发出查询,并将结果返给客户端(中继功能)

考虑多个计算机上的客户端会同时查询,需要进行消息ID

的转换

系统和运行环境描述

Windows7 操作系统平台,VS2010 编程环境。 使用 C/C++编写 dns 中继服务器。

主要数据结构

SOCKET sockfd; Socket套接字

SOCKADDR_IN ser_addr,nser_addr;

表达地址结构信息,等价于sockaddr结构

typedefstructreq_inform {//DNS 请求包信息 SOCKADDR_IN cli_addr; unsigned short id;//id 和cli_addr唯一标识一个 DNS 请求 }req_inform;

该结构唯一标示了一个来自客户端的dns请求。

map<string,string>url_ip_table;//本地域名解析表

用来构建本地存储的dnsrelay.txt 中域名和 IP 的映射。

map<unsigned short,req_inform>req_cache[cache_num];//id转换表

这一个 map 映射,把客户端dns请求映射到一个 unsigned short 上面,用它来存储 id 转换信息。Unsigned short类型的key值为新的id号,用于标识转发给外部服务器,而客户端的信息和旧id作为value存在map中,与key形成映射。待服务器发回应答包,根据包中id号,即可找到原id与客户端信息。

#define cache_num 2//转换表数目

#define cache_size 500//每个转换表容量

intidThen_max=cache_num*cache_size; //总条目数 intcur_cache=0; intidThen=0;

cache_num指定了 id 转换表的个数,cache_size是每个 id 转换表的大小,

cur_cache指向是当前正在装入的 id 转换表,idThen是一个从 0 到1000一直循环的被映射到的 id 号。这样的设计可循环利用id转换表,并及时清除旧记录。

具体流程是:

生成 id 转换的 item(idThen,structreq_inform的一个变量) 把 id 转换的 item 加入到req_cache[cur_cache]中 如果req_cache[cur_cache]已经达到cache_size {

cur_cache指向下一个 id 转换表,并将其清空 }

idThen加 1

函数划分(模块划分)

intget_url_ip_table(map<string,string>&iptable) //失败返回-1 从文件中读入url和ip的映射表。

intinit();

用来初始化ser_addr、nser_addr、sockfd,以及对sockfd绑定到本地的ser_addr的 地址上。

intis_req(char * buffer);

用来判断收到的包是上级服务器的回答包,还是来自客户端的请求包。

voidget_url(char * buf,string&url); 从请求包中提取 URL。

voidask_next_server(char * buffer,structsockaddr_inreq_addr,intbuffer_size); 询问上级dns服务器。

voidcreate_respose(char *buffer,structsockaddr_inreq_addr,int buffer_size,stringip);

根据url-ip表中找到的结果自己构造响应。

voiddeal_req(char * buffer,structsockaddr_inreq_addr,intbuffer_size); 客户端请求包的处理

voiddeal_res(char * buffer,intbuffer_size);

上级服务器回答包的处理。

int main(); 主函数

软件流程图

否 是

源代码

#include<stdio.h> #include<string.h> #include<map> #include<fstream> #include<iostream> #include<string> #include<stdlib.h>

#include "WinSock2.h"//socket 头文件

#pragma comment(lib, "ws2_32.lib") // 链接 Ws2_32.lib 库,不必再setting 里设置

using namespace std;

//id 转换表参数定义

#define cache_num 2//转换表数目

#define cache_size 500//每个转换表容量

intidThen_max=cache_num*cache_size; //总条目数 intcur_cache=0; intidThen=0;

SOCKET sockfd;

SOCKADDR_IN ser_addr,nser_addr;/* 使用sockaddr_in表达地址结构

信息,等价于sockaddr结构*/ const char * nx_ip="211.68.71.4"; const char * file_name="dnsrelay.txt";

typedefstructreq_inform {//DNS 请求包信息 SOCKADDR_IN cli_addr; unsigned short id;//id 和cli_addr唯一标识一个 DNS 请求 }req_inform;

map<string,string>url_ip_table;//本地域名解析表

map<unsigned short,req_inform>req_cache[cache_num];//id转换表 /*

structdns_ans_add

{//构造响应包所要添加的信息除了请求包外,包括指针、类型、生存时间、类、资源大小、资源等等 unsigned short url_pointer; unsigned short type; unsigned short clas_s; unsigned long ttl; unsigned short sourse_size; unsigned long sourse; }; */

intget_url_ip_table(map<string,string>&iptable) //失败返回-1 { stringtmpip,tmpurl; fstream fs; fs.open("dnsrelay.txt"); if(!fs.is_open()) { cout<<"txt can't open."<<endl; return -1; } else { iptable.clear(); while(!fs.eof()) { fs>>tmpip;

}

}

fs>>tmpurl; iptable.insert(pair<string,string>(tmpurl,tmpip)); }

fs.close(); return 0;

intinit() //失败返回-1 {

WSADatawsa;//socket 初始化

if (WSAStartup(MAKEWORD(2,2), &wsa) !=0)//Winsock 服务的初始化 { WSACleanup(); }

cout<<"winsock初始失败"<<endl; return 0;

for(inti=0;i<cache_num;i++) req_cache[i].clear();

sockfd=socket(AF_INET,SOCK_DGRAM,0);//创建 socket 套接字 ser_addr.sin_family=AF_INET;//sin_family指代协议族

ser_addr.sin_port=htons(53);//使用 53 端口即 DNS 服务器端口

ser_addr.sin_addr.s_addr=INADDR_ANY;//0.0.0.0,sin_addr 存储 IP 地址

nser_addr.sin_family=AF_INET; nser_addr.sin_port=htons(53);

nser_addr.sin_addr.s_addr=inet_addr(nx_ip);// 返回值作Internet 地址

if (bind(sockfd, (SOCKADDR*)&ser_addr, sizeof(ser_addr))==-1) {

cout<< "绑定端口失败" <<endl; return -1; } else cout<< "绑定端口成功" <<endl; return 0; }

intis_req(char * buffer) { unsigned short flags=0;

memcpy(&flags,buffer+2,2);//取标志位信息 if(flags==0x0001)//3 号位 00 2 号位 01 请求包(0001为网络顺序)本地:0100 return 1; else return 0; }

voidget_url(char * buf,string&url) {//从请求包中提取 URL int index=0; unsigned char num,i; url.clear();< …… 此处隐藏:7676字,全部文档内容请下载后查看。喜欢就下载吧 ……

DNS课程设计报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1415892.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)