Go 无阻塞网络捕获
我使用此代码捕获eInternet数据包:Go 无阻塞网络捕获,go,pcap,gopacket,Go,Pcap,Gopacket,我使用此代码捕获eInternet数据包: var snapshotLen int32 = 102400 var promiscuous bool = true var timeout time.Duration = 1 * time.Second var handle *pcap.Handle handle, err = pcap.OpenLive(device, snapshotLen, promiscuous, timeout) err = handle.SetBPFFilter(filt
var snapshotLen int32 = 102400
var promiscuous bool = true
var timeout time.Duration = 1 * time.Second
var handle *pcap.Handle
handle, err = pcap.OpenLive(device, snapshotLen, promiscuous, timeout)
err = handle.SetBPFFilter(filter)
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
}
问题是packetSource.Packets()阻塞:如果没有收到数据包,则存在无限循环。如何设置超时?来自:
func(p*PacketSource)Packets()chan Packet
数据包返回一个数据包通道,允许在
小包。数据包将从底层异步读入
PacketDataSource并写入返回的通道。如果
底层PacketDataSource
返回一个io.EOF
错误,通道将
关门。如果遇到任何其他错误,将忽略该错误
数据包:=范围packetSource.Packets(){handlePacket(数据包)
//对每个包做些什么。}
如果多次调用,则返回相同的通道
因此,由于gopacket.PacketSource.Packets()
返回一个通道,您可以使用通常的策略对两个通道执行select
ing操作,其中一个通道的操作由超时控制
在最简单的情况下,这样做可以:
timer:=time.NewTicker(2*time.Second)
延迟计时器。停止()
src:=gopacket.NewPacketSource(handle,handle.LinkType())
为了{
挑选{
案例包装:=来自:
func(p*PacketSource)Packets()chan Packet
数据包返回一个数据包通道,允许在
数据包。数据包将从底层异步读入
PacketDataSource并写入返回的通道。如果
底层PacketDataSource
返回一个io.EOF
错误,通道将
将被关闭。如果遇到任何其他错误,将忽略该错误
数据包:=范围packetSource.Packets(){handlePacket(数据包)
//对每个包做些什么。}
如果多次调用,则返回相同的通道
因此,由于gopacket.PacketSource.Packets()
返回一个通道,您可以使用通常的策略对两个通道执行select
ing操作,其中一个通道的操作由超时控制
在最简单的情况下,这样做可以:
timer:=time.NewTicker(2*time.Second)
延迟计时器。停止()
src:=gopacket.NewPacketSource(handle,handle.LinkType())
为了{
挑选{
案例pkt:=挑剔:循环的阻塞迭代和无限循环是不同的概念。挑剔:循环的阻塞迭代和无限循环是不同的概念。谢谢,它运行。我替换了:“case@ipStack,对不起,我是说time.NewTicker
,当然。更新了。谢谢,它运行。我替换了:”case@ipStack,对不起,我是说time.NewTicker
,当然。更新。