在Python中读取DNS包

2024-05-17 06:35:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩Python套接字,决定看看是否可以实现一个非常基本的名称服务器(即,一个从域名到IP地址的查找表)。所以到目前为止,我已经将服务器设置为只转储接收到的数据。

#!/usr/bin/python
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = ''
port = 53
size = 512
s.bind((host, port))
while True:
    data, addr = s.recvfrom(size)
    print repr(data)

当我运行上述代码并将我的DNS指向127.0.0.1时,我得到类似于以下内容的结果:

'Y\x04\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01'
'J\xaa\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x1c\x00\x01'
'Y\x04\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01'

我假设这与DNS问题包结构有关,但我不确定。

A)以上是转义字符吗?特定的文本编码?或者仅仅是字节?

B)我如何解释数据并使用它?

编辑:更改套接字以获取原始数据报而不是数据报将导致以下结果:

'E\x00$\x00\xe4\x96\x00\x00@\x01\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x03\x03X\xb6\x00\x00\x00\x00E\x00V\x00m\x82\x00\x00\xff\x11\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\xf3\xe1\x005\x00B\x00\x00'

Tags: 数据服务器hostdatasizeportdnssocket