北邮计算机网络课程设计DNS服务器.doc_第1页
北邮计算机网络课程设计DNS服务器.doc_第2页
北邮计算机网络课程设计DNS服务器.doc_第3页
北邮计算机网络课程设计DNS服务器.doc_第4页
北邮计算机网络课程设计DNS服务器.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北邮计算机网络课程设计DNS服务器1 环境操作系统随意,语言python2.7 2. 文件Socket.py 说明 完成缓存检测,确定是回应,还是转发,如果是回应,确定是本地回应还是外部应答转发import socketimport mydicimport charhandleimport makeframes = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)port = 53the_dic = mydic.get_web_ip()client_request = client_request_index = reverse_map = key_record = 0client_wait = s.bind(,port)time_rest = 0request_general = print runningwhile True: try: msg , (client,port) = s.recvfrom(1024) except: print Time out! continue request = request = list(msg) requre_web = charhandle.get_request(request12:) 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_requestrequest0+request1 for each_client in client_wait: my_key = client_requestrequest0+request1+str(each_client) if client_request_index.get(my_key) != None : s.sendto(msg,client_request_indexmy_key) print Response to ip and Client port: print client_request_indexmy_key break else: print Type: Client Request print ip and port: print (client,port) # requre_web = charhandle.get_request(request12:) # 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_ip0+ with frequence +str(fre) zhen = makeframe.make(re_ip0,msg) s.sendto(zhen,(client,port) else: print need to ask remote server key_record = key_record + 1 request_general = key_record client_requestrequest0+request1+str(client) = request_general client_request_indexrequest_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 pickleimport osimport threadingA=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_ipsite = ip,1 d_ip_webip = site except: print file errordata.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_dicweb_site add_frequen1 = add_frequen1 + 1 print web_site+ frequence incrase 1,with ip +add_frequen0 return add_frequen1 else: update_dicweb_site = add,1 print record for a new site return 1def 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 = argeach_key if(tmp1 not in frequence): frequence.append(tmp1) if(tmp0 = 0.0.0.0): remain_diceach_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 30): max_frequence = max(frequence) for each_key in arg: tmp = argeach_key if(tmp1 = max_frequence): remain_diceach_key = tmp0 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_diceach_key) + + str(each_key) f.write(word) f.write(n) new_diceach_key = new_diceach_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 socketdef make(re_ip,msg): tmp_list = for ch in msg: tmp_list.append(ch) tmp_list4: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_msgCharhandle.py 提取出报文中的urldef get_request(your_list): my_list = new_list = my_list.extend(your_list) re_list = thelen = ord(my_list0) try: while thelen != 0: new_list = new_list + my_list1:thelen+1 my_list0:thelen+1 = thelen = ord(my_list0) new_list.append(.) except IndexError: print bao

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论