为什么python socket.recvfrom获取的字节流与WireShark抓取的字节流不同?
我使用python套接字发送DNS查询数据包套接字并侦听响应。最后,我通过为什么python socket.recvfrom获取的字节流与WireShark抓取的字节流不同?,python,sockets,recvfrom,Python,Sockets,Recvfrom,我使用python套接字发送DNS查询数据包套接字并侦听响应。最后,我通过socket.recvfrom(2048)函数获得了预期的DNS响应包。但奇怪的是,当我将响应数据包与Wireshark抓取的数据包进行比较时,我发现存在许多差异 在第二张图片中可以发现差异为3f Wireshark爬网的DNS响应数据包(突出显示的部分) socket.recvfrom(2048) 创建插座零件代码: ipv = check_ip(dst) udp = socket.getprotob
socket.recvfrom(2048)
函数获得了预期的DNS响应包。但奇怪的是,当我将响应数据包与Wireshark抓取的数据包进行比较时,我发现存在许多差异
在第二张图片中可以发现差异为3f
Wireshark爬网的DNS响应数据包(突出显示的部分)
socket.recvfrom(2048)
创建插座零件代码:
ipv = check_ip(dst)
udp = socket.getprotobyname(Proto.UDP)
if ipv == IPV.ERROR:
return None
elif ipv == IPV.IPV4:
return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
elif ipv == IPV.IPV6:
return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, udp)
else:
return None
接收DNS响应数据包部分代码:
remained_time = 0
while True:
remained_time = self.timeout - timeit.default_timer() + sent_time
readable = select.select([sock], [], [], remained_time)[0]
if len(readable) == 0:
return (-1, None)
packet, addr = sock.recvfrom(4096)
字节
0x3F
是ASCII'?'
字符。这通常意味着数据被视为文本,并通过不支持转换字节的字符集转换
请注意,0x3F
仅替换0x7F
的字节(ASCII支持的最后一个字节)。0x80-0xFF
范围内的非ASCII字节受字符集解释的影响
这很有意义,因为您使用的是返回字符串的recvfrom()
版本,因此需要将接收到的字节转换为Python的默认字符串编码
由于您需要原始字节,请使用recvfrom\u into()
填充预先分配的bytearray
,例如:
packet = bytearray(4096)
remained_time = 0
while True:
remained_time = self.timeout - timeit.default_timer() + sent_time
readable = select.select([sock], [], [], remained_time)[0]
if len(readable) == 0:
return (-1, None)
nbytes, addr = sock.recvfrom_into(packet)
然后您可以根据需要使用数据包
多达n字节
字节数 请发布文本,而不是文本的图片。告诉我们你发现的差异中有什么有趣的地方。它们看起来差不多。你是说编码不同吗?不,我是说字节流本身。将突出显示的部分与第二张图片中的字节进行比较。在第二张图片中可以发现差异,如3f
。非常感谢!似乎仍有一些字节低于0x7f
,并被翻译成0x3f
。例如,第一张图片中的shiven·com
被翻译成了第二张图片中的shiven?·+
。@TreeSimith,回到我关于“正在通过不支持正在转换的字节的字符集转换。无论使用什么字符集来生成字符串
,都不会在出现的上下文中为字节0x6E
和0x63
定义任何字符。您还将注意到字符串
包含一个不在源字节中的0x16
字符。您的数据在转换为字符串
时已损坏,因此请停止转换。