Files
proxy/server/monitor/monitor.go
2025-02-24 14:35:13 +08:00

62 lines
1.3 KiB
Go

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())
}