【发布时间】:2013-06-03 09:01:47
【问题描述】:
我正在玩 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'
【问题讨论】:
-
如果你只需要ip域名..你可以
socket.getfqdn("173.194.37.144")也可以socket.getfqdn("www.google.com") -
谢谢,不过我对实现自己的简单解决方案很好奇,但请牢记这一点!
-
试试 scapy secdev.org/projects/scapy,它会为你解码
-
那么有没有办法将该数据作为字节数组获取?
-
map(ord, list(data))在 python2.x 和list(data)在 python3.x,但我强烈建议使用struct模块来解码它。
标签: python sockets character-encoding dns udp