fix: use timeout-loop sniff for Windows/Npcap compatibility

L2pcapListenSocket on Windows does not support 'stopper' kwarg.
Replace with timeout=1.0 polling loop that respects stop_event.
This commit is contained in:
Your Name
2026-07-13 16:53:15 +08:00
parent ea8eb2b5f9
commit 552d51df77
+14 -7
View File
@@ -88,14 +88,21 @@ class DHCPd:
bpf = "udp port 67 or udp port 68" bpf = "udp port 67 or udp port 68"
log.info("Starting packet sniff on %s (BPF: %s)", log.info("Starting packet sniff on %s (BPF: %s)",
self.iface or "<default>", bpf) self.iface or "<default>", bpf)
# Use timeout loop: L2pcapListenSocket (Windows/Npcap) does NOT
# support the 'stopper' kwarg, so poll with short timeout instead.
try: try:
sniff( while not self._stop_event.is_set():
iface=self.iface, packets = sniff(
filter=bpf, iface=self.iface,
prn=self._handle_packet, filter=bpf,
stopper=lambda: self._stop_event.is_set(), count=100, # cap per batch
store=False, timeout=1.0, # poll every ~1s
) store=False,
)
for pkt in packets:
if self._stop_event.is_set():
break
self._handle_packet(pkt)
except Exception as e: except Exception as e:
log.error("Sniffer died: %s", e) log.error("Sniffer died: %s", e)
log.info("Sniffer thread exited.") log.info("Sniffer thread exited.")