2017-02-06 1 views
0

Я собираю пакет из сети и пытаюсь разобрать его в моей программе python и отображать исходный MAC, MAC-адрес назначения и протокол каждого пакета в нем состоит из.Я получаю сообщение об ошибке: 'type' object не имеет атрибута '__getitem__'

произошла ошибка в последней строке: "печать (" Протокол: "стр [протокол], "Время жить:", ул [TimeToLive])"

Мой код:

#!usr/bin/python 

import pcapy 

from struct import* 

pcap_file=pcapy.open_offline("single.pcap") 

count=1 

while count: 
    print("Packet #:",count) 

    count=count+1 
    (header,payload)=pcap_file.next() 

    l2hdr=payload[:14] 
    l2data=unpack("!6s6sH",l2hdr) 

    srcmac="%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:" %(ord(l2hdr[0]),ord(l2hdr[1]),ord(l2hdr[2]),ord(l2hdr[3]),ord(l2hdr[4]),ord(l2hdr[5])) 
    dstmac="%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:" %(ord(l2hdr[6]),ord(l2hdr[7]),ord(l2hdr[8]),ord(l2hdr[9]),ord(l2hdr[10]),ord(l2hdr[11])) 

    print("source MAC:",srcmac,"Destination MAC:",dstmac) 

    ipheader=unpack('!BBHHHBBH4s4s',payload[14:34]) 
    timetolive=ipheader[5] 
    protocol=ipheader[6] 

    print("Protocol:",str[protocol],"Time to live:",str[timetolive]) 
+0

Просьба уточнить код стиля в стиле кода –

+0

@AlexFung Я собираю пакет из сети и пытаясь разобрать его в моей программе python и отображать исходный MAC-адрес, MAC-адрес назначения и протокол, в который каждый пакет состоит из него. .... Однако это полный код, который я написал: –

+0

@PrashuPratik, пожалуйста, включите то, что вы сказали в комментарии в своем вопросе, также. Кроме того, исправьте тег кода. – Himal

ответ

0

Измените последнюю строку на:

print("Protocol:",str(protocol),"Time to live:",str(timetolive)) 

Вы пытаетесь получить доступ к функции str с помощью квадратных скобок, который не собирается работать.

2

Seeems как вы используете [] вместо ()str для функции,

использование str(protocol), str(timetolive); check str, изменить код на str(protocol.encode()), str(timetolive.encode()) для совместимости с python3.

+0

благодарим вас за указание на общую ошибку, которую я сделал в коде. Тем не менее, я получаю еще один struct.error в строке «l2data = unpack («! 6s6sH », l2hdr)» ..... ошибка гласит, что «распаковка требует строкового аргумента длиной 14» ...... Что следует ли изменить значение с 6s6sH на, чтобы сделать длину 14? @ sideffect0 –

+0

@PrashuPratik включают это в вопрос, чтобы другие могли ответить или создать другой вопрос –

Смежные вопросы