美文网首页
gopacket 中获取包源代码分析

gopacket 中获取包源代码分析

作者: asmcos | 来源:发表于2018-09-13 16:28 被阅读0次

我们使用gopacket 监听包的时候,常常采取下面2个例子获取包。

for packet := range packetSource.Packets() {
//    ...
//  }
        packets := packetSource.Packets()
        
        for {
                select {
                case packet := <-packets:
                        // A nil packet indicates the end of a pcap file.
                        if packet == nil {
                                return
                        }
                }
       }

这个包到底是怎么循环获取的?
我们找到源代码看看。。。

func (p *PacketSource) packetsToChannel() {
        defer close(p.c)
        for {
                packet, err := p.NextPacket()
                if err == io.EOF {
                        return
                } else if err == nil {
                        p.c <- packet
                }
        }
}

// Packets returns a channel of packets, allowing easy iterating over
// packets.  Packets will be asynchronously read in from the underlying
// PacketDataSource and written to the returned channel.  If the underlying
// PacketDataSource returns an io.EOF error, the channel will be closed.
// If any other error is encountered, it is ignored.
//
//  for packet := range packetSource.Packets() {
//    handlePacket(packet)  // Do something with each packet.
//  }
//
// If called more than once, returns the same channel.
func (p *PacketSource) Packets() chan Packet {
        if p.c == nil {
                p.c = make(chan Packet, 1000)
                go p.packetsToChannel()
        }
        return p.c
}

源代码中可以看出 ,采取了make(chan Packet,1000)
原来是采取了chan,
而 Packet是通过
p.NextPacket() 循环获取,再不停的输入到chan( <-)

相关文章

网友评论

      本文标题:gopacket 中获取包源代码分析

      本文链接:https://www.haomeiwen.com/subject/lhzwgftx.html