From 552d51df772632ec67693e44ca37a5224842e10b Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 13 Jul 2026 16:53:15 +0800 Subject: [PATCH] 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. --- dhcpd/server.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/dhcpd/server.py b/dhcpd/server.py index a3902bc..db44976 100644 --- a/dhcpd/server.py +++ b/dhcpd/server.py @@ -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 "", bpf) + # Use timeout loop: L2pcapListenSocket (Windows/Npcap) does NOT + # support the 'stopper' kwarg, so poll with short timeout instead. try: - sniff( - iface=self.iface, - filter=bpf, - prn=self._handle_packet, - stopper=lambda: self._stop_event.is_set(), - store=False, - ) + while not self._stop_event.is_set(): + packets = sniff( + iface=self.iface, + filter=bpf, + 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.")