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

go的实现arp客户端

使用go实现arp客户端

net包是Go语言标准库中与网络编程有关的包,它提供了一套用于创建各种类型的网络连接的函数和接口,提供了TCP、UDP、Unix 域套接字等传输层协议的支持。

net包的主要功能如下所示:

  • 创建和管理 TCP 和 UDP 连接;
  • 解析和格式化 IP 地址和域名;
  • 实现 DNS 查询;
  • 提供了可移植的网络 I/O 接口,包括对非阻塞模式和超时控制的支持;

1、使用 net.ParseIP() 方法将字符串形式的 IP 地址解析成 net.IP 类型的变量。

类型net.IP定义表示了一个 IPv4 或 IPv6 地址,它是一个字节数组类型[]byte 的别名。

2 、使用net.Interfaces()方法获取网络接口信息

这个方法会返回一个[]net.Interface切片,其中包含了主机上所有网络接口的信息。

3、使用pcap.OpenLive() 打开指定的网络设备进行实时捕获数据包

func OpenLive(device string, snaplen int32, promisc bool, timeout time.Duration) (handle *Handle, _ error)
  • device:网络设备的名称,如eth0; 也可以使用通过pcap.FindAllDevs()获得的设备的名称;
  • snaplen: 每个数据包读取的最大长度 65535;
  • promisc:是否将网口设置为混杂模式,即是否接收目的地址不为本机的包,true;
  • timeout:设置抓到包返回的超时。如果设置成30s,那么每30s才会刷新一次数据包;设置成负数,会立刻刷新数据包,即不做等待;
  • handler :是一个*Handle类型的返回值,可以作为gopacket其他函数调用时作为函数参数来传递。
package mainimport ("fmt""net""os""time""github.com/google/gopacket""github.com/google/gopacket/layers""github.com/google/gopacket/pcap"
)func main() {if len(os.Args) != 3 {fmt.Println("Usage: ./arp_client <interface> <target_ip>")return}ifaceName := os.Args[1]targetIP := net.ParseIP(os.Args[2])if targetIP == nil {fmt.Println("Invalid target IP address")return}// 获取接口信息iface, err := net.InterfaceByName(ifaceName)if err != nil {fmt.Printf("Failed to get interface %s: %v\n", ifaceName, err)return}// 打开pcap句柄handle, err := pcap.OpenLive(ifaceName, 65536, true, pcap.BlockForever)if err != nil {fmt.Printf("Failed to open pcap handle: %v\n", err)return}defer handle.Close()// 构造第二层(Layer 2)的数据结构eth := layers.Ethernet{SrcMAC:       iface.HardwareAddr,DstMAC:       net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff},EthernetType: layers.EthernetTypeARP,}// 构造ARP(第三层 layer 3)请求数据结构arp := layers.ARP{AddrType:          layers.LinkTypeEthernet,Protocol:          layers.EthernetTypeIPv4,HwAddressSize:     6,ProtAddressSize:   4,Operation:         layers.ARPRequest,SourceHwAddress:   []byte(iface.HardwareAddr),SourceProtAddress: []byte{0, 0, 0, 0}, // 通常设为0.0.0.0DstHwAddress:      []byte{0, 0, 0, 0, 0, 0},DstProtAddress:    []byte(targetIP.To4()),}buf := gopacket.NewSerializeBuffer()opts := gopacket.SerializeOptions{FixLengths:       true,ComputeChecksums: true,}// 序列化数据包err = gopacket.SerializeLayers(buf, opts, &eth, &arp)if err != nil {fmt.Printf("Failed to serialize packet: %v\n", err)return}// 发送ARP请求err = handle.WritePacketData(buf.Bytes())if err != nil {fmt.Printf("Failed to send packet: %v\n", err)return}fmt.Printf("ARP request sent to %s via %s\n", targetIP, ifaceName)// 设置超时并监听响应start := time.Now()timeout := 5 * time.SecondpacketSource := gopacket.NewPacketSource(handle, handle.LinkType())for {if time.Since(start) > timeout {fmt.Println("Timeout waiting for ARP response")return}packet, err := packetSource.NextPacket()if err != nil {continue}arpLayer := packet.Layer(layers.LayerTypeARP)if arpLayer == nil {continue}arpResponse, _ := arpLayer.(*layers.ARP)if arpResponse.Operation == layers.ARPReply &&net.IP(arpResponse.SourceProtAddress).Equal(targetIP) {fmt.Printf("ARP response received: %s is at %s\n",targetIP, net.HardwareAddr(arpResponse.SourceHwAddress))return}}
}

<- 仅供参考->

http://www.dtcms.com/a/353464.html

相关文章:

  • 《方法论》--笛卡尔
  • 【学习笔记】非异步安全函数(禁止在信号处理中调用)
  • 雷卯针对香橙派Orange Pi 4开发板防雷防静电方案
  • 【Golang】 项目启动方法
  • Android12 user版本默认开启adb调试
  • centos7安装java mysql redis nginx
  • docker 所有常用命令,配上思维导图,加图表显示
  • 713 乘积小于k的子数组
  • Mysql数据挂载
  • Leetcode+Java+动态规划IV
  • electron离线开发环境变量ELECTRON_OVERRIDE_DIST_PATH
  • [MT6835] MT6835开启secureboot导致写入分区提示Security deny for [customer].
  • 【图像算法 - 25】基于深度学习 YOLOv11 与 OpenCV 实现人员跌倒识别系统(人体姿态估计版本)
  • 达梦数据库配置文件-COMPATIBLE_MODE
  • LangChain4j入门一:LangChain4j简介及核心概念
  • 路由基础(一):IP地址规划
  • 基于单片机空调温度控制测温ds18b20系统Proteus仿真(含全部资料)
  • React 组件命名规范:为什么必须大写首字母蛊傲
  • HarmonyOS安全开发实战:一套好用的数据加密方案
  • SQL Server 批量插入脚本
  • 中資券商櫃台系統搭建與開發技術分析
  • AI 大模型 “幻觉” 难题:为何会 “一本正经地说错话”,如何让它更靠谱?
  • 基于Cursor AI IDE的Vue3留言板系统实战:从零搭建到智能优化全流程
  • java数据类型获取长度方式总结
  • 【C++】C++11新特性第一弹(列表初始化、新式声明、范围for和STL中的变化)
  • Flutter 开发技巧 AI 快速构建 json_annotation model 的提示词
  • 使用git上传项目的步骤
  • 煤矸石检测数据集VOC+YOLO格式3090张2类别
  • This method can cause UI unresponsiveness if invoked on the main thread.
  • week5-[字符数组]数和