Go 无阻塞网络捕获

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

我使用此代码捕获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(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
,当然。更新。