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:
+14
-7
@@ -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(
|
||||
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.")
|
||||
|
||||
Reference in New Issue
Block a user