北邮计算机网络课程设计DNS服务器_北邮dns

2020-02-28 其他范文 下载本文

北邮计算机网络课程设计DNS服务器由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“北邮dns”。

北邮计算机网络课程设计DNS服务器环境

操作系统随意,语言python2.7

2.文件

Socket.py 说明

完成缓存检测,确定是回应,还是转发,如果是回应,确定是本地回应还是外部应答转发

import socket import mydic import charhandle import makeframe

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)port = 53

the_dic = mydic.get_web_ip()client_request = {} client_request_index = {} reverse_map = {} key_record = 0 client_wait = []

s.bind(('',port))

time_rest = 0 request_general = ''

print 'running' while True:

try:

msg ,(client,port)= s.recvfrom(1024)

except:

print 'Time out!'

continue

request = []

request = list(msg)

requre_web = charhandle.get_request(request[12:])

website = ''.join(requre_web)

if(port == 53):

answer = []

answer = list(msg)

print “Type:Remote Response”

print “remote answer is: ”

response_ip = msg[-4]+msg[-3]+msg[-2]+msg[-1]

char_ip = socket.inet_ntoa(response_ip)

print website + ' has the ip : '+char_ip

fre = mydic.storeForUpdate(website,char_ip)

print 'with the frequence of '+ str(fre)

###real_request = client_request[request[0]+request[1]]

for each_client in client_wait:

my_key = client_request[request[0]+request[1]+str(each_client)]

if client_request_index.get(my_key)!= None :

s.sendto(msg,client_request_index[my_key])

print “Response to ip and Client port:”

print client_request_index[my_key]

break

else:

print “Type: Client Request”

print “ip and port:”

print(client,port)

### requre_web = charhandle.get_request(request[12:])

### website = ''.join(requre_web)

print “Request website:”+website

if(the_dic.get(website)!= None):

print “Found in local cache:”

re_ip = the_dic.get(website)

print re_ip

fre = mydic.storeForUpdate(website)

print re_ip[0]+' with frequence '+str(fre)

zhen = makeframe.make(re_ip[0],msg)

s.sendto(zhen,(client,port))

else:

print “need to ask remote server”

key_record = key_record + 1

request_general = key_record

client_request[request[0]+request[1]+str(client)] = request_general

client_request_index[request_general] =(client,port)

if client not in client_wait:

client_wait.append(client)

# select authority DNS server as you wish

s.sendto(msg,('10.3.9.4',53))

time_rest = time_rest+1

try:

if(time_rest == 50):

print 'pay attention'

print '

#'

mydic.updateCache()

print '

#'

the_dic = mydic.get_web_ip()

time_rest = 0

except:

print 'not valid frequence'

print '--------------------' s.close()

Mydic.py 完成本地查询,LRU算法维护本地缓存,socket.py第97行的time_request值可以确定更新缓存的频率,可以直接输出在dnsrelay.txt内,但是为了方便观测变化,我输出到了dnsrelaycopy.txt里面,运行一段时间之后,可以去看看学习到的新条目

import pickle import os import threading A=[] d_web_ip = {} d_ip_web = {} update_dic = {}

data = open('dnsrelay.txt')for each_line in data:

try:

(ip,sitecopy)= each_line.split(' ',1)

(site,nothing)= str(sitecopy).split('n',1)

d_web_ip[site] = [ip,1]

d_ip_web[ip] = site

except:

print 'file error'

data.close()

try:

with open('newdnsrelay.pickle','wb')as newdnsrelay_file:

pickle.dump(d_web_ip,newdnsrelay_file)except IOError as err:

print 'File error:'+str(err)except pickle.PickleError as perr:

print 'Pickling error:'+str(perr)

def get_web_ip():

with open('newdnsrelay.pickle','rb')as f:

global update_dic

update_dic = pickle.load(f)

return update_dic.copy()

return(None)

def storeForUpdate(web_site, add = None):

global update_dic

if(update_dic.get(web_site)!= None):

add_frequen = update_dic[web_site]

add_frequen[1] = add_frequen[1] + 1

print web_site+' frequence incrase 1,with ip '+add_frequen[0]

return add_frequen[1]

else:

update_dic[web_site] = [add,1]

print 'record for a new site'

return 1

def updateCache():

global update_dic

m = update_dic.copy()

t = threading.Thread(target = my_thread,kwargs = m)

print 'ready to update local cache'

t.start()

t.join()

def my_thread(*argu,**arg):

frequence = []

remain_dic = {}

for each_key in arg:

tmp = arg[each_key]

if(tmp[1] not in frequence):

frequence.append(tmp[1])

if(tmp[0] == '0.0.0.0'):

remain_dic[each_key] = '0.0.0.0'

print 'various frequence:'

for each in frequence:

print 'have '+ str(each)

for each_key in remain_dic:

arg.pop(each_key)#enimilate ban

i = 0

while(i

max_frequence = max(frequence)

for each_key in arg:

tmp = arg[each_key]

if(tmp[1] == max_frequence):

remain_dic[each_key] = tmp[0]

i = i + 1

if(i == 30):

break;

frequence.remove(max_frequence)

if(not frequence):###no more

break;

updateFile(remain_dic)

def updateFile(new_dic):

f = open('dnsrelaycopy.txt','w')

for each_key in new_dic:

word = str(new_dic[each_key])+ ' ' + str(each_key)

f.write(word)

f.write('n')

new_dic[each_key] = [new_dic[each_key],0]

try:

with open('newdnsrelay.pickle','wb')as newdnsrelay_file:

pickle.dump(new_dic,newdnsrelay_file)

except IOError as err:

print 'File error:'+str(err)

except pickle.PickleError as perr:

print 'Pickling error:'+str(perr)

Makefram.py 成帧模块,形成对外围权威服务器的询问帧

import socket

def make(re_ip,msg):

tmp_list = []

for ch in msg:

tmp_list.append(ch)

tmp_list[4:12] = ['x00','x01','x00','x01','x00','x00','x00','x00']

tmp_list = tmp_list+['xc0','x0c','x00','x01','x00 ','x01','x00','x00','x02','x58','x00','x04']

dive_ip = socket.inet_aton(re_ip)

ch_ip = []

for each_ch in dive_ip:

ch_ip.append(each_ch)

tmp_list = tmp_list + ch_ip

re_msg = ''.join(tmp_list)

return re_msg

Charhandle.py 提取出报文中的url

def get_request(your_list):

my_list = []

new_list = []

my_list.extend(your_list)

re_list = []

thelen = ord(my_list[0])

try:

while thelen!= 0:

new_list = new_list + my_list[1:thelen+1]

my_list[0:thelen+1] = []

thelen = ord(my_list[0])

new_list.append('.')

except IndexError:

print “bao wen ge shi bu dui”

new_list.pop()

return new_list

原始的dnsrelay.txt老师给出了,自己去弄,把四个py文件放一个目录下,再放一个dnsrelay.txt 然后,用python shell 打开 socket.py 从python shell 运行,或者直接F5,记得把本地dns手动指向本机。

P.S:本人亲测,蒋老师没用过python,从头到尾就是我讲他听,从不为难我,我说有个LRU算法,他还说我做的好!

如果有不懂的 联系作者:302969722@qq.com 学妹优先

计算机网络课程设计 DNS 服务器 实验报告

DNS中继服务器实验报告07415林珅(13)071401 07415刘磊(18)071406 07415李鸿(19)071407一、系统概述1) 运行环境:windows XP2) 编译:Microsoft visual C++ 6.0 3) 使用方法: a) 使用i......

DNS服务器实验报告

网 络 工 程 实 验实验名称:DNS服务(系统自带)班级:计科一班组长:李柯颖(41112045)组员:马晓贤(41112033)马彬(41112036)刘永军(41112012)高富雷(41112003)张明东(41112016)前 言一、DNS服务器......

DNS服务器(windows)

DNS服务器安装实验规划DNS域名:lw.com.cn DNS服务器IP:192.168.131.51 可用的外部DNS服务器:202.102.134.68 实验目标1.配置A记录和指针记录。 2.实现客户机正常上网。配置步骤......

襄阳电信宽带DNS服务器

襄阳电信宽带DNS服务器:202.103.44.150202.103.24.68客服电话:10000襄阳网通(联通)宽带DNS服务器:218.104.111.122218.104.111.114客服电话:10010 襄阳总公司:0710-3700663 襄阳铁......

北邮计算机网络实践第三次实验报告

计算机网络技术实践实验报告实验名称 RIP和OSPF路由协议的配置及协议流程 姓 名___(-…-)_____________实 验 日 期:2014年4月11日 学 号_ 242_______实验报告日期:2014年4月1......

《北邮计算机网络课程设计DNS服务器.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
北邮计算机网络课程设计DNS服务器
点击下载文档
相关专题 北邮dns 计算机网络 课程设计 北邮 北邮dns 计算机网络 课程设计 北邮
[其他范文]相关推荐
[其他范文]热门文章
下载全文