MoonBit 抓包绑定层:运行时动态加载 wpcap.dll(Npcap)
仅支持 Windows(x86_64)。构建时零依赖(不需要 Npcap SDK),运行时才要求安装 Npcap。
| 项 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11(x86_64) |
| Npcap | 必须安装(https://npcap.com),保持默认安装 |
| 运行权限 | 管理员权限(抓包硬前提) |
moon add chensuiyi/pcap// moon.pkg: import "chensuiyi/pcap"
fn main {
match pcap.load() {
Err(msg) => {
pcap.eprint(msg)
return
}
Ok(_) => ()
}
pcap.stdout_unbuffered()
let devs = pcap.devices()
if devs.is_empty() {
pcap.eprint("未找到网络设备")
return
}
match pcap.open(devs[0].name, 65535, true, 1000) {
Err(msg) => pcap.eprint("打开设备失败: \{msg}")
Ok(pc) => {
while true {
match pcap.next(pc) {
Some(pkt) => pcap.eprint(
"\{pkt.ts_sec}.\{pkt.ts_usec} len=\{pkt.len} caplen=\{pkt.caplen}",
)
None => () // 超时或错误,继续轮询
}
}
}
}
}| 函数 | 说明 |
|---|---|
| load() -> Result[Unit, String] | 加载 wpcap.dll(进程只需一次) |
| devices() -> Array[Device] | 枚举本机网卡(Device { name, description }) |
| open(dev, snaplen, promisc, timeout_ms) -> Result[Pcap, String] | 打开设备 |
| next(p) -> PacketRaw? | 轮询收包:Some = 数据包,None = 超时或错误 |
| datalink(p) -> Int | 链路层类型(1 = Ethernet / DLT_EN10MB) |
| geterr(p) -> String | 最近一次操作的错误信息 |
| close(p) -> Unit | 停止收包循环并关闭设备 |
| local_ips() -> Array[(Bool, Bytes)] | 枚举本机 IP(GetAdaptersAddresses,v4=4 字节 / v6=16 字节) |
| stdout_unbuffered() -> Unit | stdout 设为无缓冲(管道/重定向时立即输出) |
| eprint(msg) -> Unit | 日志输出到 stderr |
pub struct PacketRaw {
ts_sec : Int64
ts_usec : Int
caplen : Int
len : Int
data : Bytes
}Install
Download zipMoonBit 抓包绑定层:运行时动态加载 wpcap.dll(Npcap)