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
+10 -3
View File
@@ -88,14 +88,21 @@ class DHCPd:
bpf = "udp port 67 or udp port 68"
log.info("Starting packet sniff on %s (BPF: %s)",
self.iface or "<default>", bpf)
# Use timeout loop: L2pcapListenSocket (Windows/Npcap) does NOT
# support the 'stopper' kwarg, so poll with short timeout instead.
try:
sniff(
while not self._stop_event.is_set():
packets = sniff(
iface=self.iface,
filter=bpf,
prn=self._handle_packet,
stopper=lambda: self._stop_event.is_set(),
count=100, # cap per batch
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:
log.error("Sniffer died: %s", e)
log.info("Sniffer thread exited.")