我想通过使用“ github.com/google/gopacket/pcap”在4个接口设备eth0,eth1,eth2和eth3上捕获数据包。我使用的机器流量很大。可以说每分钟缺乏。我使用goroutines并行捕获每个设备上的数据包。
在centOS 7机器上运行我的代码二进制文件后,经过一段时间(少于1小时或更长时间)后,出现以下错误之一。
1)运行时:指向未分配范围idx = 0x108cc的指针0xc441198b80 span.base()= 0xc441196000 span.limit = 0xc441197ff0 span.state = 3致命 错误:在Go堆中发现了错误的指针(不正确使用unsafe或cgo?)
2)细分错误
3)致命错误:意外的goroutine调用了systemstack 分割错误
我如何使用goroutines-
func main(){
done = make(chan bool)
var status bool = true
for _, interface_device := range util.ConfigDetails.InterfaceDeviceList{
go func(device string) {
status = CapturePackets(device)
fmt.Println("status is", status)
done <- true
}(interface_device)
}
// wait for all goroutines to complete before exiting
for _ = range util.ConfigDetails.InterfaceDeviceList {
<-done
}
}
func CapturePackets(device string) bool {
handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, pcap.BlockForever)
if err != nil {
util.Log.Errorf("%v",err)
}
defer handle.Close()
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
parser := gopacket.NewDecodingLayerParser(
layers.LayerTypeEthernet,
ðLayer,
&ipLayer,
&ip6Layer,
&tcpLayer,
&udpLayer,
&payload,
)
for packet := range packetSource.Packets() {
foundLayerTypes := []gopacket.LayerType{}
var ip_source,ip_dest net.IP
for _, layerType := range foundLayerTypes {
if layerType == layers.LayerTypeIPv4 {
ip_source = ipLayer.SrcIP
ip_dest = ipLayer.DstIP
}
if layerType == layers.LayerTypeIPv6 {
ip_source = ip6Layer.SrcIP
ip_dest = ip6Layer.DstIP
}
fmt.Println(ip_source)
fmt.Println(ip_dest)
}
}
return true
}
请帮助我。