当我使用goroutines使用“ github.com/google/gopacket/pcap”从多个接口设备捕获数据包时发生运行时错误

时间:2018-08-06 11:06:46

标签: go goroutine gopacket

我想通过使用“ 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,
                &ethLayer,
                &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
    }

请帮助我。

0 个答案:

没有答案