DNS服务器客户端通信协议

时间:2012-10-04 13:39:53

标签: python sockets dns

我需要写一篇关于DNS如何工作的文章,并在python中构建一个小而功能强大的DNS服务器。

我有一个简单的UDP套接字服务器,当收到这样的数据包时会打开一个线程:

while 1:
  try:
    stream, addr = serversocket.recvfrom(buffr)
    threading.Thread(target=handler, args=(stream, addr, threading.activeCount(),)).start()
  except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    except_catch(exc_type.__name__, exc_value, exc_traceback, threading.current_thread().name)

处理函数只是试图找到内存中请求的记录,如果没有,它将执行另一个在另一台服务器上运行dns查询的函数,如果他没有它,则获取记录。这有点像故障安全,我的问题在哪里。

def dnsrn(ip, type):
  try:
    mkr = dns.resolver.Resolver()
    mkr.nameservers = ['192.168.0.1']
    res = mkr.query(ip, type)

    for rdata in res:
      return rdata.address # this works for A records
      # to do for other types of records

  except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    except_catch(exc_type.__name__, exc_value, exc_traceback, threading.current_thread().name)

我还没有完成它,你可以看到,但我已经有问题了。 有时候,这个函数会动作,线程永远不会完成,如果它没有在错误日志中给出任何错误。 我已经测试过,错误日志应该捕获孩子抛出的所有错误。 我有一个简单的客户端,它被编程为每隔一段时间从一个预设点发送一个随机请求,当孩子挂起时似乎没有模式。 经过大约24小时的测试后,我留下了大约1-3个僵尸线程。

如果您想知道这是异常函数的样子:

def except_catch(type, value, track, thread=None):
  if type != "SystemExit":
    import traceback

    rawreport = traceback.format_exception(type, value, track)
    report = "\n" . join(rawreport)

    errorlog = open(error_log_path + "/errors.log", "a")

    if thread != None:
      errorlog.write("Exception in thread: " + thread + "\n\n")

    errorlog.write(("%s\n" + "-" * 30 + "\n\n") % report)

    errorlog.close()
sys.excepthook = except_catch

1 个答案:

答案 0 :(得分:2)

我会检查RFC,因为这是协议的确切规范。 DNS的问题是,有多个RFC。对于一个简单的开始,我会检查包含基础知识的RFC 1035。如果您需要高级功能,请查看其他相关的RFC。