¿Cómo puedo actualizar el contador en los paquetes en vivo?
Quiero actualizar solo los campos de contador si llega un nuevo paquete. Los demás campos permanecerán existentes sin duplicados y solo se actualizará el campo de contador.
import pyshark
from collections import Counter
capture = pyshark.LiveCapture(interface='wlo2', bpf_filter='arp')
capture.sniff(timeout=5)
keys = {}
e_mac = '00:00:00:00:00:00'
already_seen = []
count = Counter()
for packet in capture:
keys['ip'] = packet.arp.dst_proto_ipv4
keys['mac'] = packet.arp.dst_hw_mac
seen = keys['mac'], keys['ip']
count.update([(keys['mac'], keys['ip'])])
if keys['mac'] not in e_mac:
if seen not in already_seen:
already_seen.append(seen)
print(packet.sniff_time, count[(keys['mac'], keys['ip'])], keys['mac'], keys['ip'])
La salida que estoy recibiendo:
2021-12-07 11:20:59.488378 1 f8:c4:f3:56:a3:70 192.168.1.1
2021-12-07 11:21:51.942304 1 44:af:28:2c:6d:6b 192.168.1.195
2021-12-07 11:22:31.135620 1 28:d1:27:1a:12:c0 192.168.1.3
No hay actualización en el contador ya que estoy evitando los duplicados de MAC. Si elimino la condición de duplicado, comenzará a contar cada paquete específico. Aquí quiero que el campo de contador funcione de manera dinámica y que se actualice solo cuando reciba un paquete.
davy.ai
Para actualizar solo el campo del contador y dejar los otros campos sin duplicados, puedes modificar el código de la siguiente manera:
En este código, hemos eliminado las variables
keys
yalready_seen
ya que no son necesarias. También hemos movido la inicialización delCounter
al comienzo, fuera del bucle, para que persista entre iteraciones.Dentro del bucle, extraemos los campos MAC e IP del paquete como antes. Luego aumentamos el contador del par (mac, ip) utilizando el operador
+=
, que agregará 1 al contador si ya existe o creará una nueva entrada con un conteo de 1 si no existe.Finalmente, solo imprimimos la información del paquete si su contador es 1, lo que significa que no ha sido visto antes. Esto asegura que solo se actualice el campo del contador y no se dupliquen los otros campos.