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

时间:2025-05-04

蒋大神要求的DNS服务器 python语言完成,都在这里啦!

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

1 环境

操作系统随意,语言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 = []

蒋大神要求的DNS服务器 python语言完成,都在这里啦!

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:

蒋大神要求的DNS服务器 python语言完成,都在这里啦!

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 = {}

蒋大神要求的DNS服务器 python语言完成,都在这里啦!

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():

蒋大神要求的DNS服务器 python语言完成,都在这里啦!

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

whi …… 此处隐藏:3948字,全部文档内容请下载后查看。喜欢就下载吧 ……

北邮计算机网络课程设计DNS服务器.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219