...
1
2
3 package main
4
5 import (
6 "flag"
7 "fmt"
8 "log"
9 "net"
10 "net/netip"
11 "time"
12
13 "github.com/mdlayher/arp"
14 )
15
16 var (
17
18 durFlag = flag.Duration("d", 1*time.Second, "timeout for ARP request")
19
20
21 ifaceFlag = flag.String("i", "eth0", "network interface to use for ARP request")
22
23
24 ipFlag = flag.String("ip", "", "IPv4 address destination for ARP request")
25 )
26
27 func main() {
28 flag.Parse()
29
30
31 ifi, err := net.InterfaceByName(*ifaceFlag)
32 if err != nil {
33 log.Fatal(err)
34 }
35
36
37 c, err := arp.Dial(ifi)
38 if err != nil {
39 log.Fatal(err)
40 }
41 defer c.Close()
42
43
44 if err := c.SetDeadline(time.Now().Add(*durFlag)); err != nil {
45 log.Fatal(err)
46 }
47
48
49 ip, err := netip.ParseAddr(*ipFlag)
50 if err != nil {
51 log.Fatal(err)
52 }
53 mac, err := c.Resolve(ip)
54 if err != nil {
55 log.Fatal(err)
56 }
57
58 fmt.Printf("%s -> %s", ip, mac)
59 }
60
View as plain text