北邮计算机网络课程设计DNS服务器
时间:2025-05-04
时间: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