package monitor import ( "context" "encoding/hex" "github.com/google/gopacket" "github.com/google/gopacket/pcap" "github.com/pkg/errors" "log/slog" ) func Start(ctx context.Context, errCh chan error) { // 打开一个网络接口 device, err := pcap.OpenLive("WLAN", 1600, true, pcap.BlockForever) if err != nil { b, er := hex.DecodeString("\\xbb") slog.Debug("b", b, er) errCh <- errors.Wrap(err, "打开网络接口失败") return } defer device.Close() err = device.SetBPFFilter("tcp") if err != nil { errCh <- errors.Wrap(err, "设置 BPF 过滤器失败") return } err = device.SetDirection(pcap.DirectionIn) if err != nil { errCh <- errors.Wrap(err, "设置捕获方向失败") return } // 创建一个数据包源 source := gopacket.NewPacketSource(device, device.LinkType()) source.NoCopy = true source.Lazy = true for { select { case <-ctx.Done(): slog.Debug("monitor 被动结束") errCh <- nil return case packet := <-source.Packets(): handle(packet) } } } func handle(packet gopacket.Packet) { slog.Debug("Packet: ", packet) slog.Debug("Layers: ", packet.Layers()) slog.Debug("Application: ", packet.ApplicationLayer()) slog.Debug("Transport: ", packet.TransportLayer()) slog.Debug("Network: ", packet.NetworkLayer()) slog.Debug("Link: ", packet.LinkLayer()) }