python - DNS服务器客户端通信协议(protocol)

标签 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)

如你所见,我还没有完成它,但我已经遇到了问题。 有时,这个函数会处理并且线程永远不会完成,除非它在错误日志中给出任何错误。 我已经测试过,错误日志应该捕获 child 抛出的所有错误。 我有一个简单的客户端,它被编程为在每个设定的时间向一系列预设发送随机请求,并且 child 何时挂起似乎没有任何模式。 经过大约 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

最佳答案

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

关于python - DNS服务器客户端通信协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728560/

相关文章:

python - 如何使用 Python 将多个 Excel 工作表从网站下载到 Pandas DataFrame 中

python - 指定在 doctest 套件中运行 testsetup block 的顺序

python ->> 运算符(operator)如何在 Airflow 中定义任务依赖关系?

C# 如何手动清除 TCP 套接字缓冲区?

http - IP 跟踪到您的原籍国背后的实际机制是什么?

Python - 如何在 GNU/Linux 中获取 Firefox 的 URL 栏内容?

perl - IO::Socket 与 Socket 我都是 "use"吗?

java - 通过套接字重复发送对象

azure - 在 Azure 上仅托管我网站的一些子域

mysql - MySQL远程连接的rDNS安全