从字节流读取时数据损坏

时间:2019-02-04 14:25:22

标签: python python-3.x sockets networking python-3.7

对于一个网络项目,我正在使用UDP组播通过我自己的IP实现来构建覆盖网络。

我首先使用以下内容来解析和构建Header,然后附加有效负载:

def __init__(buffer_size_bytes):
    self.__buffer = bytearray(buffer_size_bytes)

def read_sock(self, listening_socket):
    n_bytes, addr = listening_socket.recvfrom_into(self.__buffer, Packet.HEADER_SIZE)
    packet = Packet.parse_header(self.__buffer)

    if packet.payload_length is not 0:
        packet.payload = parse_payload(packet.payload_length, listening_socket)

    self.__router.add_to_route_queue(packet, listening_socket.locator)

def parse_payload(to_read, socket):
    payload = bytearray(to_read)
    view = memoryview(payload)
    while to_read:
        n_bytes, addr = socket.recvfrom_into(view, to_read)
        view = view[n_bytes:]
        to_read -= n_bytes

    return payload

该标头似乎已正确解析,但是有效载荷每次都被破坏。解析有效负载时,我无法弄清楚自己在做什么,并且可以确认我是从另一侧发送字节数组。

例如,当我发送带有utf-8编码的有效载荷“ Hello World”的数据包时,会收到以下消息:

b'`\x00\x00\x00\x00\x0b\x00\x1f\x00\x00\x00'

Packet.parse_header方法:

def parse_header(cls, packet_bytes):
    values = struct.unpack(cls.ILNPv6_HEADER_FORMAT, packet_bytes[:cls.HEADER_SIZE])

    flow_label = values[0] & 1048575
    traffic_class = (values[0] >> 20 & 255)
    version = values[0] >> 28
    payload_length = values[1]
    next_header = values[2]
    hop_limit = values[3]
    src = (values[4], values[5])
    dest = (values[6], values[7])

    return Packet(src, dest, next_header, hop_limit, version, traffic_class, flow_label, payload_length)

作为参考,整个发送的数据包如下所示:

b'`\x00\x00\x00\x00\x0b\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01Hello World'

在接收到第一个数据包时,socket.recvfrom_into在读取有效负载时会阻塞,并且直到我发送另一条消息后才返回。然后,它似乎会丢弃前一条消息的有效负载,并使用接收到的第二个数据包作为有效负载...

1 个答案:

答案 0 :(得分:0)

找到了我的解释here

所以关键是我正在使用UDP。 UDP套接字会丢弃您提供的缓冲区中不适合的任何内容。

TCP套接字的行为更像我期望的字节流。

好玩!