mirror of
https://github.com/zr-hebo/sniffer-agent.git
synced 2025-09-19 18:19:20 +08:00
add windows support
This commit is contained in:
@@ -1,17 +1,21 @@
|
||||
//go:build linux
|
||||
// +build linux
|
||||
|
||||
package capture
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
log "github.com/golang/glog"
|
||||
"github.com/google/gopacket"
|
||||
"github.com/google/gopacket/layers"
|
||||
"github.com/google/gopacket/pcap"
|
||||
"github.com/google/gopacket/pcapgo"
|
||||
"golang.org/x/net/bpf"
|
||||
)
|
||||
|
||||
func initEthernetHandlerFromPacp() (handler PcapHandler) {
|
||||
func initEthernetHandlerFromPacp() (pcapgoHandler *pcapgo.EthernetHandle) {
|
||||
pcapgoHandler, err := pcapgo.NewEthernetHandle(DeviceName)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("cannot open network interface %s <-- %s", DeviceName, err.Error()))
|
||||
@@ -40,6 +44,58 @@ func initEthernetHandlerFromPacp() (handler PcapHandler) {
|
||||
}
|
||||
|
||||
_ = pcapgoHandler.SetCaptureLength(65536)
|
||||
handler = pcapgoHandler
|
||||
return
|
||||
}
|
||||
|
||||
func dealEachTCPIPPacket(dealTCPIPPacket func(tcpIPPkt *TCPIPPair)) {
|
||||
handler := initEthernetHandlerFromPacp()
|
||||
defer func() {
|
||||
handler.Close()
|
||||
}()
|
||||
|
||||
for {
|
||||
var ci gopacket.CaptureInfo
|
||||
data, ci, err := handler.ZeroCopyReadPacketData()
|
||||
if err != nil {
|
||||
log.Error(err.Error())
|
||||
time.Sleep(time.Second * 3)
|
||||
continue
|
||||
}
|
||||
|
||||
packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy)
|
||||
m := packet.Metadata()
|
||||
m.CaptureInfo = ci
|
||||
|
||||
tcpPkt, ok := packet.TransportLayer().(*layers.TCP)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
ipLayer := packet.NetworkLayer()
|
||||
if ipLayer == nil {
|
||||
log.Error("no ip layer found in package")
|
||||
continue
|
||||
}
|
||||
|
||||
var srcIP, dstIP string
|
||||
switch realIPLayer := ipLayer.(type) {
|
||||
case *layers.IPv6:
|
||||
{
|
||||
srcIP = realIPLayer.SrcIP.String()
|
||||
dstIP = realIPLayer.DstIP.String()
|
||||
}
|
||||
case *layers.IPv4:
|
||||
{
|
||||
srcIP = realIPLayer.SrcIP.String()
|
||||
dstIP = realIPLayer.DstIP.String()
|
||||
}
|
||||
}
|
||||
|
||||
tcpipPair := &TCPIPPair{
|
||||
srcIP: srcIP,
|
||||
dstIP: dstIP,
|
||||
tcpPkt: tcpPkt,
|
||||
}
|
||||
dealTCPIPPacket(tcpipPair)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user