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.")