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"
|
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.")
|
||||||
|
|||||||
Reference in New Issue
Block a user