zoukankan      html  css  js  c++  java
  • go 网络数据包分析(2)

    另一种方式解码数据包:

    package main
    
    import (
            "fmt"
            "github.com/google/gopacket"
            "github.com/google/gopacket/layers"
            "github.com/google/gopacket/pcap"
            "log"
            "os"
            "time"
    )
    
    var (
            device      string = "ens33"
            snapshotLen int32  = 1024
            promiscuous bool   = false
            err         error
            timeout     time.Duration = 30 * time.Second
            handle      *pcap.Handle
    )
    
    func main() {
            // Open device
            handle, err = pcap.OpenLive(device, snapshotLen, promiscuous, timeout)
            if err != nil {
                    log.Fatal(err)
            }
            defer handle.Close()
    
            packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
            for packet := range packetSource.Packets() {
                    printPacketInfo(packet)
            }
    }
    
    func printPacketInfo(packet gopacket.Packet) {
            var eth layers.Ethernet
            var ip4 layers.IPv4
            var ip6 layers.IPv6
            var tcp layers.TCP
    
            parser := gopacket.NewDecodingLayerParser(layers.LayerTypeEthernet, &eth, &ip4, &ip6, &tcp)
            decoded := []gopacket.LayerType{}
    
            if err := parser.DecodeLayers(packet.Data(), &decoded); err != nil {
                    fmt.Fprintf(os.Stderr, "Could not decode layers: %v
    ", err)
                    return
            }
    
            for _, layerType := range decoded {
                    switch layerType {
                    case layers.LayerTypeEthernet:
                            fmt.Println("    Eth ", eth.SrcMAC, eth.DstMAC)
                    case layers.LayerTypeIPv6:
                            fmt.Println("    IP6 ", ip6.SrcIP, ip6.DstIP)
                    case layers.LayerTypeIPv4:
                            fmt.Println("    IP4 ", ip4.SrcIP, ip4.DstIP)
                    case layers.LayerTypeTCP:
                            fmt.Println("    TCP ", tcp.SrcPort, tcp.DstPort)
                    }
            }
    }
    

      

  • 相关阅读:
    SPOJ-BRCKTS (括号序列,线段树)
    bzoj 2223 [Coci 2009]PATULJCI
    bzoj 1049 [HAOI2006]数字序列
    bzoj2091 [Poi2010]The Minima Game
    bzoj 1016 [JSOI2008]最小生成树计数
    bzoj5105 晨跑 数论lcm
    bzoj 1211 [HNOI2004]树的计数
    bzoj 1430 小猴打架 prufer 性质
    Swing界面组件的通用属性
    数字调节控件JSpinner的使用
  • 原文地址:https://www.cnblogs.com/wangjq19920210/p/14118924.html
Copyright © 2011-2022 走看看