【问题标题】:DNS server client communication protocol [closed]DNS服务器客户端通信协议[关闭]
【发布时间】:2012-09-25 13:34:24
【问题描述】:

我需要写一篇关于 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

【问题讨论】:

  • zoneedit.com/doc/rfc 应该提供足够的输入。
  • 您看过 RFC 10341035,对吧?无论如何,这并不是一个真正的 Python 问题。
  • 如果您搜索“dns 查询示例”,网络上有很多信息,例如 herehere。如果您想执行逆向工程,请在从客户端发出 DNS 请求时查看 Wireshark。
  • 我检查的第一件事。那里有很多信息,但是要理解其中的一些部分对于菜鸟来说有点挑战性。多个条目的答案没有很好的记录。我正在寻找一些关于在 python 中做这样的事情的信息,主要不是一般信息,因为这不是很精确,而且在我的水平上很难理解。

标签: python sockets dns


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多