mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-10-31 08:29:33 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Currently only Darwin and Linux support this.
 | |
| 
 | |
| package arpdis
 | |
| 
 | |
| import (
 | |
| 	"log"
 | |
| 	"net"
 | |
| 	"os/exec"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| func doLookup(ip net.IP) *Addr {
 | |
| 	// ping := exec.Command("ping", "-c1", "-t1", ip.String())
 | |
| 	// if err := ping.Run(); err != nil {
 | |
| 	// 	addr := &Addr{IP: ip, Type: TypeUnreachable}
 | |
| 	// 	return addr
 | |
| 	// }
 | |
| 
 | |
| 	err := doPing(ip.String())
 | |
| 	if err != nil {
 | |
| 		// log.Println(err)
 | |
| 		addr := &Addr{IP: net.IPv4(1, 2, 3, 4), Type: TypeUnreachable}
 | |
| 		copy(addr.IP, ip)
 | |
| 		return addr
 | |
| 	}
 | |
| 
 | |
| 	return doArpShow(ip)
 | |
| }
 | |
| 
 | |
| func doArpShow(ip net.IP) *Addr {
 | |
| 	cmd := exec.Command("ip", "n", "show", ip.String())
 | |
| 	out, err := cmd.Output()
 | |
| 	if err != nil {
 | |
| 		log.Println("lookup show", err)
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	// os.Open("/proc/net/arp")
 | |
| 	// 192.168.1.2      0x1         0x2         e0:94:67:e2:42:5d     *        eth0
 | |
| 	// 192.168.1.2 dev eth0 lladdr 08:00:27:94:a5:a4 STALE
 | |
| 	outS := strings.ReplaceAll(string(out), "  ", " ")
 | |
| 	outS = strings.TrimSpace(outS)
 | |
| 	arpArr := strings.Split(outS, " ")
 | |
| 	if len(arpArr) != 6 {
 | |
| 		log.Println("lookup arpArr", outS, ip)
 | |
| 		return nil
 | |
| 	}
 | |
| 	mac, err := net.ParseMAC(arpArr[4])
 | |
| 	if err != nil {
 | |
| 		log.Println("lookup mac", outS, err)
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	addr := &Addr{IP: net.IPv4(1, 2, 3, 4), HardwareAddr: mac}
 | |
| 	copy(addr.IP, ip)
 | |
| 	return addr
 | |
| }
 | |
| 
 | |
| // IP address       HW type     Flags       HW address            Mask     Device
 | |
| // 172.23.24.12     0x1         0x2         00:e0:4c:73:5c:48     *        anylink0
 | |
| // 172.23.24.1      0x1         0x2         3c:8c:40:a0:7a:2d     *        anylink0
 | |
| // 172.23.24.13     0x1         0x2         00:1c:42:4d:33:46     *        anylink0
 | |
| // 172.23.24.2      0x1         0x0         00:00:00:00:00:00     *        anylink0
 | |
| // 172.23.24.14     0x1         0x0         00:00:00:00:00:00     *        anylink0
 |