从字节流读取时数据损坏
Data Corrupted When Reading from Byte Stream
对于一个网络项目,我正在使用 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
header 似乎被正确解析,但有效载荷每次都被破坏。我无法弄清楚我在解析有效载荷时做错了什么,我可以确认我正在从另一端发送字节数组。
例如,当我发送一个有效载荷 "Hello World" 以 utf-8 编码的数据包时,我收到以下内容:
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 会在读取有效负载时阻塞,并且不会 return 直到我发送另一条消息。然后它似乎丢弃了前一条消息的有效负载并使用接收到的第二个数据包作为有效负载...
找到我的解释here。
所以关键是我使用的是 UDP。 UDP 套接字会丢弃任何不适合您提供的缓冲区的内容。
然而,TCP 套接字的行为更像我所期待的字节流。
好玩!
对于一个网络项目,我正在使用 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
header 似乎被正确解析,但有效载荷每次都被破坏。我无法弄清楚我在解析有效载荷时做错了什么,我可以确认我正在从另一端发送字节数组。
例如,当我发送一个有效载荷 "Hello World" 以 utf-8 编码的数据包时,我收到以下内容:
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 会在读取有效负载时阻塞,并且不会 return 直到我发送另一条消息。然后它似乎丢弃了前一条消息的有效负载并使用接收到的第二个数据包作为有效负载...
找到我的解释here。
所以关键是我使用的是 UDP。 UDP 套接字会丢弃任何不适合您提供的缓冲区的内容。
然而,TCP 套接字的行为更像我所期待的字节流。
好玩!