当前位置: 首页 > news >正文

Golang中实现调用Windows API向指定目标发送ARP请求

简介

Go库中很多实现的arp都是支持osx/linux/bsd之类的, 但几乎没有支持windows的, 也试了一些方式,
目前还是选用调用windows的API, 记录一下这一次windows的API的调用经验。

实现

代码

package main/*
#cgo CFLAGS: -I.
#cgo LDFLAGS: -liphlpapi -lws2_32
#include <winsock2.h>
#include <windows.h>
#include <iphlpapi.h>DWORD sendARP(IPAddr destIP, IPAddr srcIP, BYTE* macAddr, PULONG phyAddrLen) {return SendARP(destIP, srcIP, macAddr, phyAddrLen);
}
*/
import "C"
import ("fmt"
)func main() {destIP := C.inet_addr(C.CString("192.168.3.2")) // 目标IP地址var srcIP C.IPAddr = C.INADDR_ANY               // 源IP地址,使用INADDR_ANY表示任意本地地址var macAddr [6]C.BYTEphyAddrLen := C.ULONG(6)result := C.sendARP(destIP, srcIP, &macAddr[0], &phyAddrLen)if result == C.NO_ERROR {mac := fmt.Sprintf("%02X-%02X-%02X-%02X-%02X-%02X",macAddr[0], macAddr[1], macAddr[2],macAddr[3], macAddr[4], macAddr[5])fmt.Println("MAC address:", mac)} else {switch result {case C.ERROR_GEN_FAILURE:fmt.Printf(" (ERROR_GEN_FAILURE)\n")breakcase C.ERROR_INVALID_PARAMETER:fmt.Printf(" (ERROR_INVALID_PARAMETER)\n")breakcase C.ERROR_INVALID_USER_BUFFER:fmt.Printf(" (ERROR_INVALID_USER_BUFFER)\n")breakcase C.ERROR_BAD_NET_NAME:fmt.Printf(" (ERROR_GEN_FAILURE)\n")breakcase C.ERROR_BUFFER_OVERFLOW:fmt.Printf(" (ERROR_BUFFER_OVERFLOW)\n")breakcase C.ERROR_NOT_FOUND:fmt.Printf(" (ERROR_NOT_FOUND)\n")breakdefault:fmt.Printf("\n")break}fmt.Println("SendARP failed with error code:", result)}
}

注意点

  1. 启用CGO
    CGO_ENABLED=1在这里插入图片描述

  2. 设置gcc、g++
    例如我将Qt的编译组件 加到环境变量中,记住自己系统或者配置的cpu选择gcc\g++ 我设置的环境变量是-> D:\Softwares\IDEs\Qt\Tools\mingw810_64\bin

  3. 头文件先后错误问题

#include <winsock2.h>
#include <windows.h>
#include <iphlpapi.h>

在cgo标志里面包含这些头文件, winsock2.h必须在前, 否则报错。

  1. 包装器方式解决类型问题
#include <winsock2.h>
#include <windows.h>
#include <iphlpapi.h>DWORD sendARP(IPAddr destIP, IPAddr srcIP, BYTE* macAddr, PULONG phyAddrLen) {return SendARP(destIP, srcIP, macAddr, phyAddrLen);
}

如果直接调用SendARP会报类型错误的问题, 所以这里需要先包装器一层, 确定表层转化类型。

  1. 明确类型

对的

var srcIP C.IPAddr = C.INADDR_ANY // 源IP地址,使用INADDR_ANY表示任意本地地址

下面 错误, 使用时报类型错误问题

var srcIP = C.INADDR_ANY // 源IP地址,使用INADDR_ANY表示任意本地地址

其余参考官方接口提供的示例, 改成go的即可…

参考

sendARP 函数 (iphlpapi.h)

http://www.lryc.cn/news/341493.html

相关文章:

  • 这是一个简单的照明材料网站,后续还会更新
  • 【设计模式】之模板方法模式
  • 【系统架构师】-选择题(十一)
  • 前端开发攻略---介绍HTML中的<dialog>标签,浏览器的原生弹框。
  • 让外贸业绩翻倍的销售话术分享
  • 观测与预测差值自动变化系统噪声Q的自适应UKF(AUKF_Q)MATLAB编写
  • 虚拟数据中心
  • 解决Blender导出FBX文件到Unity坐标轴错误的问题
  • 基于微信小程序的校园二手闲置物品交易平台的设计与实现
  • java中多线程的3种实现方法
  • 【Docker】docker compose服务编排
  • elementui的el-select+el-tree+el-input实现可搜索的下拉树组件
  • 微信公众号排名 SEO的5个策略
  • python烟花代码
  • Python高级编程
  • leetCode75. 颜色分类
  • 选择器、pxcook软件、盒子模型
  • 商城系统秒杀功能设计思想
  • #初始化列表
  • Vue-组件中的data
  • 抖音小店达人佣金应该怎么结算呢?给达人设置多少佣金合适?
  • 水稻病害检测(YOLO数据集,多分类,稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫)
  • MYSQL数据库专业术语及创建数据表详细讲解{sql语句创建数据库语句及条件子句解析,编码格式解析,创建数据表解析,表定义字段解析,主键约束解析}
  • Kubernetes的13个常用命令,你都熟悉吗
  • python从0开始学习(三)
  • golang判断通道chan是否关闭的2种方式
  • npm install 会报错npm audit错误,会提示你有多少个漏洞需要结局等
  • 揭秘磁盘参数错误:数据恢复的黄金法则与预防策略
  • oracle常见操作
  • SkyWalking 自定义Span并接入告警