diff --git a/cap.go b/cap.go index f8f735b..827b224 100644 --- a/cap.go +++ b/cap.go @@ -53,11 +53,14 @@ func printPacketInfo(packet gopacket.Packet) { } } +// startPacketCapture 启动数据包捕获 func startPacketCapture() { + // 打开指定的网络接口进行实时数据包捕获 handle, err := pcap.OpenLive(*InterfaceName, 65535, true, pcap.BlockForever) if err != nil { log.Fatalf("打开网络接口 %s 出错: %v", *InterfaceName, err) } + // 确保在函数退出时关闭句柄,释放资源 defer func() { fmt.Println("清理资源...") if handle != nil { @@ -65,11 +68,13 @@ func startPacketCapture() { } }() + // 设置 BPF(Berkeley Packet Filter)过滤器,以便只捕获指定协议的数据包 err = handle.SetBPFFilter(*Protocol) if err != nil { log.Fatalf("设置 BPF 过滤器出错: %v", err) } + // 如果指定了输出文件,则创建文件并初始化 pcapgo.Writer var pcapWriter *pcapgo.Writer if *PcapFile != "" { file, err := os.Create(*PcapFile) @@ -79,21 +84,27 @@ func startPacketCapture() { defer file.Close() pcapWriter = pcapgo.NewWriter(file) + // 写入 pcap 文件头部,指定最大捕获长度和链路层类型 err = pcapWriter.WriteFileHeader(65535, layers.LinkTypeEthernet) if err != nil { log.Fatalf("写入全局头部出错: %v", err) } } + // 创建数据包源,用于从网络接口读取数据包 packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) - fmt.Printf("正在监听网络接口 %s,使用过滤器 '%s'...\n", *InterfaceName, *Protocol) + fmt.Printf("正在监听网络接口 %s, 使用过滤器 '%s'...\n", *InterfaceName, *Protocol) + // 创建信号通道,用于捕获中断信号 sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) + // 启动一个 goroutine 来处理捕获到的数据包 go func() { for packet := range packetSource.Packets() { + // 打印数据包信息 printPacketInfo(packet) + // 如果指定了输出文件,则将数据包写入文件 if pcapWriter != nil { err := pcapWriter.WritePacket(packet.Metadata().CaptureInfo, packet.Data()) if err != nil { @@ -103,6 +114,7 @@ func startPacketCapture() { } }() + // 等待中断信号,收到信号后停止捕获 <-sigChan fmt.Println("\n停止抓包...") } diff --git a/denyip b/denyip index e529da5..883fb14 100644 Binary files a/denyip and b/denyip differ