Ну, во-первых, если у вас будет задержка / таймер, вам нужно import time
или если вы используете sleep(n)
, чтобы сделать from time import sleep
.Во-вторых, я лично считаю, что таймеры - не лучший вариант для перехвата пакетов.Особенно, если вы фильтруете / ищете определенные типы пакетов.Кроме того, чтобы получить какие-либо соответствующие детали необработанного пакета, вам необходимо его деконструировать.Модуль struct
в python, вероятно, лучше всего подходит для этого, и вам нужно знать, как извлечь данные из определенных полученных пакетов.При получении пакетных данных с использованием s.recvfrom(65535)
они сохраняются в кортеже, и вам необходимо сосредоточиться на первом элементе этого, используя что-то вроде:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
try:
packet = s.recvfrom(65565)
packet = packet[0]
#begin to analyse and deconstruct packet data
except:
pass
Каждый пакет данных построен таким образом, чтоВы можете извлечь полезную информацию из каждого из них.Простой поиск того, как они упакованы, может помочь вам узнать, как деконструировать их и показать информацию.Посмотрите на модуль struct
, и это должно вас оттолкнуть!Если вам действительно нужна задержка по какой-то причине, я бы использовал максимум sleep(0.5)
.
Для эффективности вы можете захотеть реализовать многопоточность.Если ваш код работает нормально, это не обязательно будет необходимо, но если вы захотите, вы можете запустить поток для деконструкции полученного пакета, пока ваш NIC все еще принимает пакеты.ЧТО-ТО выглядело бы так:
import socket
import thread
def deconstructPacket(packet):
#code to deconstruct packet
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
try:
packet = s.recvfrom(65565)
packet = packet[0]
thread.start_new_thread(deconstructPacket, packet)
except:
pass #or handle any errors
Надеюсь, это помогло !!!