首先用了walk里面的一个winapi.go

// Copyright 2010 The go-winapi Authors. All rights reserved.

// Use of this source code is governed by a BSD-style

// license that can be found in the LICENSE file.

package winapi

import (

"runtime"

"syscall"

"unsafe"

)

func init() {

runtime.LockOSThread()

}

const (

S_OK = 0x00000000

S_FALSE = 0x00000001

E_UNEXPECTED = 0x8000FFFF

E_NOTIMPL = 0x80004001

E_OUTOFMEMORY = 0x8007000E

E_INVALIDARG = 0x80070057

E_NOINTERFACE = 0x80004002

E_POINTER = 0x80004003

E_HANDLE = 0x80070006

E_ABORT = 0x80004004

E_FAIL = 0x80004005

E_ACCESSDENIED = 0x80070005

E_PENDING = 0x8000000A

)

const (

FALSE = 0

TRUE = 1

)

type (

BOOL int32

HRESULT int32

)

type GUID struct {

Data1 uint32

Data2 uint16

Data3 uint16

Data4 [8]byte

}

func MustLoadLibrary(name string) uintptr {

lib, err := syscall.LoadLibrary(name)

if err != nil {

panic(err)

}

return uintptr(lib)

}

func MustGetProcAddress(lib uintptr, name string) uintptr {

addr, err := syscall.GetProcAddress(syscall.Handle(lib), name)

if err != nil {

panic(err)

}

return uintptr(addr)

}

func SUCCEEDED(hr HRESULT) bool {

return hr >= 0

}

func FAILED(hr HRESULT) bool {

return hr < 0

}

func MAKELONG(lo, hi uint16) uint32 {

return uint32(uint32(lo) | ((uint32(hi)) << 16))

}

func LOWORD(dw uint32) uint16 {

return uint16(dw)

}

func HIWORD(dw uint32) uint16 {

return uint16(dw >> 16 & 0xffff)

}

func UTF16PtrToString(s *uint16) string {

return syscall.UTF16ToString((*[1 << 29]uint16)(unsafe.Pointer(s))[0:])

}

func MAKEINTRESOURCE(id uintptr) *uint16 {

return (*uint16)(unsafe.Pointer(id))

}

func BoolToBOOL(value bool) BOOL {

if value {

return 1

}

return 0

}

具体的SendARP实现

package winapi

import (

"syscall"

"unsafe"

)

var (

// Library

libIphlpapi uintptr

libWs2_32 uintptr

// Functions

sendARP uintptr

inet_addr uintptr

)

func init() {

// library

libIphlpapi = MustLoadLibrary("Iphlpapi.dll")

libWs2_32 = MustLoadLibrary("Ws2_32.dll")

// Functions

/** SendARP(DestIp IPAddr, SrcIp IPAddr, &MacAddr, &PhysAddrLen ULONG) **/

sendARP = MustGetProcAddress(libIphlpapi, "SendARP")

inet_addr = MustGetProcAddress(libWs2_32, "inet_addr")

}

/**

* macAddr是目标的MAC地址

*/

func SendARP(destIP, srcIP int32, macAddr *int64, physAddrLen *int) int {

ret, _, _ := syscall.Syscall6(sendARP, 4,

uintptr(destIP),

uintptr(srcIP),

uintptr(unsafe.Pointer(macAddr)),

uintptr(unsafe.Pointer(physAddrLen)),

0,

0)

return int(ret)

}

func Inet_addr(ipaddr string) (result int32) {

ret, _, _ := syscall.Syscall(inet_addr, 1, // 1表示有一个参数

uintptr(unsafe.Pointer(syscall.StringBytePtr(ipaddr))),

0,

0)

return int32(ret)

}

调用

package main

import (

"lqz/system/winapi"

// "strconv"

// "strings"

// "os"

"log"

"fmt"

)

func main() {

for i := 1; i <= 100; i++ {

getMac(fmt.Sprintf("192.168.2.%d", i))

}

}

func getMac(ip string) {

var macLen int = 6

var mac int64 = 0

destIP := winapi.Inet_addr(ip)

result := winapi.SendARP(destIP, 0, &mac, &macLen)

if result == 0 {

log.Print(ip)

pyMac := fmt.Sprintf("%012X", mac)

x := 2 * macLen

var tempMac string

for i := 0; i < macLen; i++ {

if i == (macLen - 1) {

tempMac = tempMac + pyMac[x-2:x]

} else {

tempMac = tempMac + pyMac[x-2:x] + "-"

}

x -= 2

}

log.Println(tempMac)

}

}

感觉还有点缺陷,比如说那个0, 应该在上面定义好的,但是我不知道这个面的值,都表示什么意思,只知道0是NOERROR,还有其他信息,但是我看MSDN上面的SendARP里面没有给出值,这个以后补上

go 调用winapi_Go调用Window SendARP() 方法相关推荐

  1. html 两个iframe重叠,解决同一页面中两个iframe互相调用jquery,js函数的方法

    这一个月又没更新博客,唉,懒癌又犯了,今天解决了一个问题,关于两个iframe互相调用jquery函数方法 a.html中有两个iframe,如下: b.html中有一个treeview,称为左菜单i ...

  2. 通过setTimeout调用设置iframe src的方法导致刷新页面时弹出没有权限错误!

    通过setTimeout调用设置iframe src的方法导致刷新页面时弹出没有权限错误! 如下: Html代码 <iframe tabindex="4" id=" ...

  3. html调用父页面的函数,js调用父框架函数与弹窗调用父页面函数的方法

    调用父级中的 aaa的函数 子页面中: οnclick="window.parent.frames.aaa()" 父页面中: function aaa() { alert('bbb ...

  4. Android调用相机与相册的方法

    Android调用相机与相册的方法 操作流程 点击拍摄 效果图 点击相册选择 效果图 拒绝权限的情况 效果图 功能实现 项目配置 1.先在项目根目录的build.gradle的repositories ...

  5. C# WPF 调用打印机的两种方法

    C# WPF 调用打印机的两种方法 最近在调试打印机,为了方便测试写了一个小demo.为了更好的判断是打印机硬件的问题还是动态库的问题,设定了定时器不间断打印来进行测试.现来分享记录一下. 需要调用两 ...

  6. 子页面调用父页面的js方法或参数(iframe.contentWindow)

    子页面调用父页面的js方法或参数 子页面调用父页面的参数 父页面调用子页面的参数或方法 相关链接 子页面调用父页面的参数 window.parent.aa();//调取aa函数 window.pare ...

  7. 为什么静态方法无法直接调用非静态成员变量和方法

    静态方法无法直接调用非静态成员变量和方法 看到这句话,要想到形容的是这样的如下 静态方法里面无法调用非静态变量 下面在写一个对比非静态的方法和静态方法调用变量对比 问题原因 静态变量和静态的方法是属于 ...

  8. 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】

    C#中dll调用方法 一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要 ...

  9. 织梦 PHP 字段 调用,织梦dede网站内容模型普通文章调用自定义图片字段的方法(和调用...

    织梦DedeCMS网站内容模型普通文章调用自定义图片字段的方法: 我们首先需要创建一个自定义函数, 找到:/include/extend.func.php ,在 function GetOneImgU ...

最新文章

  1. 《评人工智能如何走向新阶段》后记
  2. Python学习之解决python下载第三方依赖速度慢的问题
  3. 雷林鹏分享:PHP 5 时区
  4. Server Too Busy
  5. 关于KVM的几篇细节文档
  6. QT中关于窗口全屏显示与退出全屏的实现
  7. SVN cleanup 反复失败解决办法
  8. 【网站建设】简单一行代码,为网站开启深色模式支持
  9. w3cschool oracle,AJAX 数据库 | w3cschool菜鸟教程
  10. 计算机网络应用基础_2020年天津市成人高考 高起专 计算机基础题型总结
  11. Struts2的学习-属性驱动和模型驱动
  12. smarty 缓存用法简述(转)
  13. php小h站视频系统源码,苹果cms v10x 原创自适应x站h站源码 视频模板 带试看功能 带自动采集YM源码...
  14. 火力发电行业三大知识图谱应用场景,助力火力发电厂清洁高效智慧化运营
  15. 数据仓库ETL工具箱——简介
  16. android 导航栏动画,使用Lottie动画实现底部导航栏
  17. 安氏图书报刊发行管理软件[酷软推荐]
  18. PyTorch笔记【1】---A卡安装(RX580)无果后,改为N卡(2070)安装。这年头就不要用CPU了来搞AI了
  19. anaconda+pycharm安装
  20. 手机空间不足?教你2招省5G空间

热门文章

  1. mysql分库分表中间件6_当当开源sharding-jdbc,轻量级数据库分库分表中间件
  2. omv检查硬盘坏道_关于怎么用MHDD修复硬盘坏道
  3. 助力企业高效率办公,华为云桌面必不可少
  4. 生成短的8位UUID(C#+JAVA)
  5. Arduino IDE安装UNO和NANO开发板驱动教程(CH341SER.EXE)
  6. 汽车二自由度相关数学表达式(持续更新)
  7. 2021中国各省区块链政策竞争力指数TOP10(3月)|链塔月榜
  8. CLRS 1.1算法
  9. 【JAVA程序设计】(C00043)基于SSM非maven的人事管理系统
  10. 剑指offer刷题:javaHZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解