на основе TCP, работающий через сокеты. Есть структура переменной длины (указана в length):
otdr_protocol_message = Struct(
'magic' / Const(b'NtOTDRModule\0\0\0\0'),
'length' / Rebuild(Int32ul, len_(this.data)),
'data' / Byte[this.length]
)
Структуру можно прочитать из байтов или из потока (io.BytesIO), но как это сделать из socket.socket? То есть чтобы Construct самостоятельно читал нужное количество байт из сокета до тех пор, пока не десериализована вся структура?
Иначе говоря, можно ли как-то заставить socket.socket работать с протоколом BytesIO (чтобы работали методы .read(n: int) -> bytes и .write(data: bytes))?
Звучит как хуйня
а зачем? нельзя прочитать и вызвать потом конструкт?
Я не знаю, сколько байт читать из сокета, потому что размер data может быть произвольным. То есть структура не постоянной, а переменной длины. Размер указан в length, и это поле нужно сначала декодировать.
так у тебя две части - заголовок и data. Первое читаешь, потом дату
Покопался во внутренностях Construct. Он не может работать с сокетом потому, что использует stream.seek() (установить курсор на нужную позицию в стриме) и stream.tell() (сообщить позицию курсора), что сокеты не умеют. Наверное, как-то можно буферизировать прочитанные данные из сокета в BytesIO, а в определённый момент очищать буфер.
Обсуждают сегодня