最全Golang抓包:实现网络数据包捕获与分析_golang pcap,2024年最新太厉害了
package main
import (
"fmt"
"log"
"time"
"github.com/google/gopacket"
"github.com/google/gopacket/pcap"
"github.com/google/gopacket/tcpassembly"
)
// 定义一个简单的监听器,用于捕获和打印网络数据包信息
func listenPackets(handle *pcap.Handle, wg *sync.WaitGroup) {
defer wg.Done()
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
fmt.Printf("捕获到数据包: %+v\n", packet)
}
}
func main() {
// 确定网络接口
devices, err := pcap.FindAllDevs()
if err != nil {
log.Fatal(err)
}
var device string
for _, d := range devices {
if d.Name != "lo" {
device = d.Name
break
}
}
if device == "" {
log.Fatal("没有找到可用的网络接口")
}
// 打开网络接口
handle, err := pcap.OpenLive(device, 65535, true, pcap.BlockForever)
if err != nil {
log.Fatal(err)
}
defer handle.Close()
// 设置过滤器
if err := handle.SetBPFFilter("tcp port 80"); err != nil {
log.Fatal(err)
}
// 开始捕获数据包
var wg sync.WaitGroup
wg.Add(1)
go listenPackets(handle, &wg)
// 等待Ctrl+C或其他中断信号
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
// 优雅关闭
handle.Close()
wg.Wait()
}
这段代码使用了gopacket库和pcap库来捕获和分析网络数据包。它首先确定了一个可用的网络接口,然后使用pcap.OpenLive()打开该接口进行监听。接着,它设置了一个TCP端口为80的过滤器来过滤需要监听的数据包。最后,它启动了一个goroutine来监听和处理捕获的数据包,并且等待用户中断信号来优雅地关闭数据包捕获。这个例子展示了如何在Go语言中进行基本的网络数据包捕获和分析。
评论已关闭