У меня точно такая же проблема, и я решил ее, используя вашу справочную ссылку Python arp сниффинг необработанного сокета без пакетов ответа и небольшое собственное исследование.
conn=socket.socket(socket.AF_PACKET,socket.SOCK_RAW,socket.ntohs(0x0003))
def arp_header(packet):
(a ,b ,c ,d ,e ,f ,g ,h ,i ) = struct.unpack('2s2s1s1s2s6s4s6s4s',packet[14:42])
hw_type=(binascii.hexlify(a)).decode('utf-8')
proto_type=(binascii.hexlify(b)).decode('utf-8')
hw_size=(binascii.hexlify(c)).decode('utf-8')
proto_size=(binascii.hexlify(d)).decode('utf-8')
opcode=(binascii.hexlify(e)).decode('utf-8')
return (hw_type,proto_type,hw_size,proto_size,opcode,socket.inet_ntoa(g),socket.inet_ntoa(i))
использовать struct.unpack('2s2s1s1s2s6s4s6s4s',packet[14:42])
не struct.unpack('!2s2s1s1s2s6s4s6s4s',packet[14:42])
это решило мою struct.error: unpack requires a string argument of length 28
ошибку
Я также использовал отдельные переменные, в соответствии с требованиями моего проекта,
Теперь для отладки я использовал print(packet[14:42])
- который дал мне байтовые шестнадцатеричные литералы (например, b'\x00\x01\x08\x00\x06\x04\x00\x01\xe4\x11[I&\xbe\n\x00.....
и т. Д.)
поэтому я должен декодировать в utf-8 после использования hexlify, так как hexlify снова возвращает мне байтовые объекты.
Python версия, которую я использовал: 3.6.5
Дата: 03 / апрель / 2019
Результат: - Arp Packet:
- H/W Type: 0001, Protocol Type: 0800, H/W Size: 06 ,Protocol Size: 04
- Opcode: 0001, Source IP: 10.0.15.141, Destination IP: 10.0.10.2
Вердикт: Этот метод работал для меня, я надеюсь, он будет работать и для вас:)