DNS课程设计报告
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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [法律文档]苏教版七年级语文下册第五单元教学设计
- [法律文档]向市委巡视组进点汇报材料
- [法律文档]绵阳市2018年高三物理上学期第二次月考
- [法律文档]浅析如何解决当代中国“新三座大山”的
- [法律文档]延安北过境线大桥工程防洪评价报告 -
- [法律文档]激活生成元素让数学课堂充满生机
- [法律文档]2014年春学期九年级5月教学质量检测语
- [法律文档]放射科标准及各项计1
- [法律文档]2012年广州化学中考试题和答案(原版)
- [法律文档]地球物理勘查规范
- [法律文档]《12系列建筑标准设计图集》目录
- [法律文档]2018年宁波市专技人员继续教育公需课-
- [法律文档]工会委员会工作职责
- [法律文档]2014新版外研社九年级英语上册课文(完
- [法律文档]《阅微草堂笔记》部分篇目赏析
- [法律文档]尔雅军事理论2018课后答案(南开版)
- [法律文档]储竣-13827 黑娃山沟大开挖穿越说明书
- [法律文档]《产品设计》教学大纲及课程简介
- [法律文档]电动吊篮专项施工方案 - 图文
- [法律文档]实木地板和复合地板的比较
- 探析如何提高电力系统中PLC的可靠性
- 用Excel函数快速实现体能测试成绩统计
- 教师招聘考试重点分析:班主任工作常识
- 高三历史选修一《历史上重大改革回眸》
- 2013年中山市部分职位(工种)人力资源视
- 2015年中国水溶性蛋白市场年度调研报告
- 原地踏步走与立定教学设计
- 何家弘法律英语课件_第十二课
- 海信冰箱经销商大会——齐俊强副总经理
- 犯罪心理学讲座
- 初中英语作文病句和错句修改范例
- 虚拟化群集部署计划及操作流程
- 焊接板式塔顶冷凝器设计
- 浅析语文教学中
- 结构力学——6位移法
- 天正建筑CAD制图技巧
- 中华人民共和国财政部令第57号——注册
- 赢在企业文化展厅设计的起跑线上
- 2013版物理一轮精品复习学案:实验6
- 直隶总督署简介




