要在 Go 语言中监听和接收指定接口的 ARP 报文,你可以使用 gopacket 库来实现。下面是一个简单的示例代码:
package main
import (
"fmt"
"log"
"net"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
func main() {
iface := "eth0" // 指定接口名字
handle, err := pcap.OpenLive(iface, 1600, true, pcap.BlockForever)
if err != nil {
log.Fatal(err)
}
defer handle.Close()
err = handle.SetBPFFilter("arp") // 只过滤 ARP 报文
if err != nil {
log.Fatal(err)
}
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
arpLayer := packet.Layer(layers.LayerTypeARP)
if arpLayer != nil {
fmt.Println("Received ARP packet")
fmt.Printf("%s\n", packet.Dump()) // 打印完整的报文信息
arpl := arpLayer.(*layers.ARP)
fmt.Println("Sender Hardware Address:", arpl.SourceHwAddress.String())
fmt.Println("Sender Protocol Address:", net.IP(arpl.SourceProtAddress).String())
fmt.Println("Target Hardware Address:", arpl.DstHwAddress.String())
fmt.Println("Target Protocol Address:", net.IP(arpl.DstProtAddress).String())
fmt.Println()
}
}
}
需要注意的是,这段代码依赖于 github.com/google/gopacket 包,你需要先安装它。可以通过以下命令来安装:
go get github.com/google/gopacket
在代码中,你需要将 iface 变量设置为要监听的接口名称,然后使用 pcap.OpenLive 打开该接口。之后使用 handle.SetBPFFilter 过滤出 ARP 报文。最后,通过循环读取 packetSource.Packets() 中的报文,并提取出 ARP 层信息。
请根据实际情况修改代码并进行测试。
内容由零声教学AI助手提供,问题来源于学员提问




