...

Source file src/github.com/mdlayher/arp/cmd/arpc/main.go

Documentation: github.com/mdlayher/arp/cmd/arpc

     1  // Command arpc provides a simple ARP client which can be used to retrieve
     2  // hardware addresses of other machines in a LAN using their IPv4 address.
     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  	// durFlag is used to set a timeout for an ARP request
    18  	durFlag = flag.Duration("d", 1*time.Second, "timeout for ARP request")
    19  
    20  	// ifaceFlag is used to set a network interface for ARP requests
    21  	ifaceFlag = flag.String("i", "eth0", "network interface to use for ARP request")
    22  
    23  	// ipFlag is used to set an IPv4 address destination for an ARP request
    24  	ipFlag = flag.String("ip", "", "IPv4 address destination for ARP request")
    25  )
    26  
    27  func main() {
    28  	flag.Parse()
    29  
    30  	// Ensure valid network interface
    31  	ifi, err := net.InterfaceByName(*ifaceFlag)
    32  	if err != nil {
    33  		log.Fatal(err)
    34  	}
    35  
    36  	// Set up ARP client with socket
    37  	c, err := arp.Dial(ifi)
    38  	if err != nil {
    39  		log.Fatal(err)
    40  	}
    41  	defer c.Close()
    42  
    43  	// Set request deadline from flag
    44  	if err := c.SetDeadline(time.Now().Add(*durFlag)); err != nil {
    45  		log.Fatal(err)
    46  	}
    47  
    48  	// Request hardware address for IP address
    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