Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python socket.recvfrom获取的字节流与WireShark抓取的字节流不同?_Python_Sockets_Recvfrom - Fatal编程技术网

为什么python socket.recvfrom获取的字节流与WireShark抓取的字节流不同?

为什么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

我使用python套接字发送DNS查询数据包套接字并侦听响应。最后,我通过
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
字符。您的数据在转换为
字符串
时已损坏,因此请停止转换。