我需要通过套接字将答案(www.google.com。58 IN A 172.217.6.68)发送到另一个测试代码。
我尝试了sock.sendto(message.answer.to_wire(),addr),但是从服务器收到一条消息,提示AttributeError:'list'对象没有属性'to_wire'
def process_message(sock):
global cache, pending_requests
# Listen for an incoming UDP message through the socket
data, addr = sock.recvfrom(BUFFERSIZE)
message = dns.message.from_wire(data)
sock.sendto(message.to_wire(),(GOOGLE_DNS, DNS_PORT))
sock.sendto(message.answer.to_wire(),addr)
# Open a UDP socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
# Listen on the PORT for traffic destined to any IP address
s.setblocking(0)
s.bind(('', PORT))
# Read from the socket without blocking, to allow CTRL+C to exit our program
inputs = [s]
outputs = []
while inputs:
# Waiting for a UDP message
readable, writable, exceptional = select.select(inputs, outputs, inputs)
for sock in readable:
# Socket has data, read from it
process_message(sock)
测试者代码
# Listen for a response from the nameserver
data, addr = s.recvfrom(BUFFERSIZE)
message = dns.message.from_wire(data)
if len(message.answer) == 0:
print("No ANSWER records in response.")
else:
# Print the DNS answer records
for answer in message.answer:
print(answer.to_text())
我希望从dns得到测试者代码的答案(www.google.com。58 IN AA 172.217.6.68),但是我在服务器代码中遇到错误,而测试者中没有答案。
答案 0 :(得分:0)
因此,您的代码行引起的错误是:
sock.sendto(message.answer.to_wire(),addr)
根据 Message 类的文档,其 answer 属性返回dns.rrset.RRset对象的列表。
>message.answer 是一个列表。但是,您尝试在其上调用 to_wire()方法。由于Python中的列表对象没有 to_wire()方法,因此会出现错误 AttributeError:'list'对象没有属性'to_wire'。>
是否可能要遍历 message.answer 列表,然后对该列表中包含的每个对象调用 to_wire()?根据文档, RRSet 确实具有 to_wire()方法,所以我猜想这就是您想要做的。
...,也许在您的情况下, message.answer 中总是只有一项。如果可以进行此假设,则可以将该行更改为:
sock.sendto(message.answer[0].to_wire(),addr)
或者如果您可以有多个答案,也许您想要这样:
for answer in message.answer:
sock.sendto(answer.to_wire(),addr)