python невозможно извлечь протокол из этого rnet frame 'struct.error: для распаковки требуется буфер в 20 байт' - PullRequest
0 голосов
/ 14 февраля 2020

Я использую python для извлечения прокола (udp, tcp) из дейтаграммы ip. Но моя проблема - распаковать данные, которые я получаю из кадра rnet. Я использую эту функцию для этого

def ipv4_head(data):
 version_h = data[0]
 version = version_h >> 4
 header_length = (version_h & 15) * 4
 ttl, proto, src, target = struct.unpack('! 8x B B 2x 4s 4s', raw_data[:20])
 data = raw_data[header_length:]
 return version, header_length, ttl, proto, src, target, data

Моя проблема в этой строке '' '

struct.unpack ('! 8x BB 2x 4s 4s ', raw_data [: 20] )

У меня ошибка

struct.error: для распаковки требуется буфер в 20 байт

Я пробовал много думает, это один тоже дает тот же результат

struct.unpack ("! BBHHHBBH4s4s", raw_data)

с другой функцией, но все тот же

def ipv4_head(raw_data):
  store=struct.unpack("!BBHHHBBH4s4s", raw_data)
  src_ip=socket.inet_ntoa(store[8])
  dst_ip=socket.inet_ntoa(store[9])
  protocol=store[6]

  return src_ip,dst_ip, protocol

Но это то же самое, я использую python 3.

Мне тоже интересно, чтобы обойти struct.unpack с помощью другого метода. Много дней я боролся с этой ошибкой, но ничего не нашел в inte rnet.

Заранее спасибо, ребята

1 Ответ

0 голосов
/ 14 февраля 2020

Ошибка говорит вам, что ваш буфер (второй аргумент) имеет длину не 20 байт.

Можете ли вы попробовать print(len(raw_data[:20]))? Если raw_data короче 20 байтов, ваше выражение будет недостаточно длинным.

...