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