62 lines
1.3 KiB
Go
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())
|
|
}
|