2017-04-16 6 views
-1

Windows APIを呼び出そうとしていますSendARP Windowsでarp要求を送信しますが、常に1168、AKA ERROR_NOT_FOUND、このエラーコード:Go内のWindows DLLを呼び出してARP要求を送信すると、

要素が見つかりません。このエラーは、SrcIpパラメータがローカルコンピュータのインターフェイス上の送信元IPv4アドレスまたはINADDR_ANY IPアドレス(IPv4アドレス0.0.0.0)を指定していない場合にWindows Vistaで返されます。

私はWindows 7ですが、さらに適切なソースIPv4アドレスを指定します。 WiresharkではARPパケットは送信されません。だから問題はどこにあるの?

package main 

import (
    "fmt" 
    "syscall" 
    "net" 
    "unsafe" 
) 

var (
    iphlp, _ = syscall.LoadLibrary("iphlpapi.dll") 
    SendARP, _ = syscall.GetProcAddress(iphlp, "SendARP") 
) 

func sendARP(src, dst net.IP) { 
    //var nargs uintptr = 4 
    var len uint = 6 
    mac := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff} 
    ret, _, callErr := syscall.Syscall6(
    uintptr(SendARP), 4, 
    uintptr(unsafe.Pointer(&dst[0])), 
    uintptr(unsafe.Pointer(&src[0])), 
    uintptr(unsafe.Pointer(&mac[0])), 
    uintptr(unsafe.Pointer(&len)), 
    0, 
    0) 

    if callErr == 0 { 
     fmt.Printf("result %v\n", int(ret)) 
    } 
} 

func main() { 
    defer syscall.FreeLibrary(iphlp) 

    fmt.Printf("addr: %v\n", sendARP) 

    dst := net.IPv4(192,168,1,1) 
    src := net.IPv4(192,168,1,103) 
    sendARP(src, dst) 
} 

答えて

1

、それは私のために動作し、この

package main 

import (
    "fmt" 
    "log" 
    "net" 
    "syscall" 
    "unsafe" 
) 

var SendARP = syscall.MustLoadDLL("iphlpapi.dll").MustFindProc("SendARP") 

func ip4ToUint32(ip net.IP) (uint32, error) { 
    ip = ip.To4() 
    if ip == nil { 
     return 0, fmt.Errorf("ip address %v is not ip4", ip) 
    } 
    var ret uint32 
    for i := 4; i > 0; i-- { 
     ret <<= 8 
     ret += uint32(ip[i-1]) 
    } 
    return ret, nil 
} 

func sendARP(ip net.IP) (net.HardwareAddr, error) { 
    dst, err := ip4ToUint32(ip) 
    if err != nil { 
     return nil, err 
    } 
    mac := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff} 
    n := uint32(len(mac)) 
    ret, _, _ := SendARP.Call(
     uintptr(dst), 
     0, 
     uintptr(unsafe.Pointer(&mac[0])), 
     uintptr(unsafe.Pointer(&n))) 
    if ret != 0 { 
     return nil, syscall.Errno(ret) 
    } 
    return mac, nil 
} 
func main() { 
    ip := net.IPv4(192, 168, 1, 1) 
    mac, err := sendARP(ip) 
    if err != nil { 
     log.Fatalf("could not find MAC for %q: %v", ip, err) 
    } 
    fmt.Printf("MAC address for %v is %v\n", ip, mac) 
} 

を試してみてください。

はアレックス

+0

おかげで、私はすでにこの問題を見つけた:最初に、 'net.IPv4'は、IPアドレス(16バイトの形で)、ない4バイトのフォーム私は思った通り、第二、' SendARPを返します。 '第1と第2のパラメータのビッグエンディアン順序であるべき' IPAddr'を期待します。 – jfly

関連する問題