广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang arp请求
  • 402
分享到

golang arp请求

2023-05-16 17:05:02 402人浏览 薄情痞子
摘要

本文将介绍如何使用golang发送ARP请求来获取目标设备的Mac地址。ARP(Address Resolution Protocol)是解析网络层地址(IP地址)和数据链路层地址(MAC地址)的一种协议。在局域网中,每个设备都有一个唯一的

本文将介绍如何使用golang发送ARP请求来获取目标设备的Mac地址。

ARP(Address Resolution Protocol)是解析网络层地址(IP地址)和数据链路层地址(MAC地址)的一种协议。在局域网中,每个设备都有一个唯一的MAC地址,用于识别该设备。当我们知道目标设备的IP地址,但不知道其MAC地址时,可以发送一个ARP请求以获取该设备的MAC地址。

Golang中,我们可以使用net包中的net.InterfaceAddrs()函数来获取当前设备的IP和MAC地址。然后,使用net包中的net.ParseIP()函数将目标IP地址解析为IP类型的变量。接下来,使用gopacket库构建一个ARP请求包,并发送它到网络中。

让我们来看一下示例代码:

package main

import (
    "fmt"
    "net"
    "time"

    "GitHub.com/google/gopacket"
    "github.com/google/gopacket/layers"
    "github.com/google/gopacket/packetio"
    "github.com/google/gopacket/pcap"
)

func main() {
    // 获取当前设备的IP和MAC地址
    interfaces, err := net.Interfaces()
    if err != nil {
        panic(err)
    }
    var localIP net.IP
    var localMAC net.HardwareAddr
    for _, iface := range interfaces {
        if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 {
            addrs, err := iface.Addrs()
            if err != nil {
                panic(err)
            }
            for _, addr := range addrs {
                switch addr := addr.(type) {
                case *net.IPNet:
                    if addr.IP.To4() != nil {
                        localIP = addr.IP
                    }
                case *net.IPAddr:
                    if addr.IP.To4() != nil {
                        localIP = addr.IP
                    }
                }
            }
            localMAC = iface.HardwareAddr
            break
        }
    }
    if localIP == nil || localMAC == nil {
        panic("Could not find local IP and MAC addresses")
    }
    fmt.Println("Local IP:", localIP)
    fmt.Println("Local MAC:", localMAC)

    // 目标IP地址
    targetIP := net.ParseIP("192.168.1.1")
    if targetIP == nil {
        panic("Invalid target IP address")
    }
    fmt.Println("Target IP:", targetIP)

    // 使用gopacket构建ARP请求包
    var buf gopacket.SerializeBuffer
    opts := gopacket.SerializeOptions{}
    eth := layers.Ethernet{
        SrcMAC:       localMAC,
        DstMAC:       net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
        EtherNettype: layers.EthernetTypeARP,
    }
    arp := layers.ARP{
        AddrType:          layers.LinkTypeEthernet,
        Protocol:          layers.EthernetTypeIPv4,
        HwAddressSize:     6,
        ProtAddressSize:   4,
        Operation:         layers.ARPRequest,
        SourceHwAddress:   []byte(localMAC),
        SourceProtAddress: []byte(localIP.To4()),
        DstHwAddress:      []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
        DstProtAddress:    []byte(targetIP.To4()),
    }
    if err := gopacket.SerializeLayers(&buf, opts, &eth, &arp); err != nil {
        panic(err)
    }

    // 打开网络接口并发送ARP请求包
    handle, err := pcap.OpenLive("eth0", 65535, true, pcap.BlockForever)
    if err != nil {
        panic(err)
    }
    defer handle.Close()
    if err := handle.WritePacketData(buf.Bytes()); err != nil {
        panic(err)
    }

    // 等待一段时间以获得目标设备的MAC地址
    time.Sleep(time.Second)
    packetSource := packetio.NewPacketSource(handle, handle.LinkType())
    for packet := range packetSource.Packets() {
        arpLayer := packet.Layer(layers.LayerTypeARP)
        if arpLayer != nil {
            arpPacket, _ := arpLayer.(*layers.ARP)
            if arpPacket.Operation == layers.ARPReply && bytes.Equal(arpPacket.SourceProtAddress, targetIP.To4()) {
                fmt.Println("Target MAC:", net.HardwareAddr(arpPacket.SourceHwAddress))
                return
            }
        }
    }
    panic("Could not resolve target MAC address")
}

在示例代码中,我们首先使用net包获取当前设备的IP和MAC地址。然后,使用net.ParseIP()函数将目标IP地址解析为IP类型的变量。接下来,我们使用gopacket.SerializeLayers()函数构建ARP请求包。我们首先定义Ethernet层,设置源MAC地址为本地MAC地址,目标MAC地址为广播地址。然后定义ARP层,设置请求类型为ARP请求,源MAC地址和源IP地址为本地MAC地址和本地IP地址,目标MAC地址为0,目标IP地址为目标IP地址。最后,我们通过pcap.OpenLive()函数打开网络接口并写入ARP请求包。

我们等待一段时间以便获取目标设备的响应。使用packetio.NewPacketSource()函数获取接收数据的源,然后使用for循环遍历接收到的数据包。如果收到ARP响应,并且源IP地址为目标IP地址,则表示我们已经获得了目标设备的MAC地址。程序输出目标设备的MAC地址,并结束运行。

使用以上代码可以轻松地发送ARP请求并获取目标设备的MAC地址。

以上就是golang arp请求的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: golang arp请求

本文链接: https://www.lsjlt.com/news/210327.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang arp请求
    本文将介绍如何使用Golang发送ARP请求来获取目标设备的MAC地址。ARP(Address Resolution Protocol)是解析网络层地址(IP地址)和数据链路层地址(MAC地址)的一种协议。在局域网中,每个设备都有一个唯一的...
    99+
    2023-05-16
  • http请求 golang
    一、什么是HTTP请求HTTP请求是指客户端向服务器发送请求的行为。在网络中,客户端和服务器之间可以通过HTTP协议进行通信。客户端发送HTTP请求,服务器根据请求返回响应。因此,HTTP请求是构成网络通信的关键部分之一。在HTTP请求中,...
    99+
    2023-05-16
  • golang http 请求
    Golang是一种开源的编程语言,它的出现让许多开发者都非常感兴趣。在网络开发方面,Golang使用起来非常方便,使得HTTP请求更加简单和可靠。Golang对于HTTP请求提供了良好的支持,可以很容易地创建HTTP请求来达到目的。本文将探...
    99+
    2023-05-16
  • php请求golang
    PHP和Golang是两种不同的编程语言,它们在应用场景、语法设计和性能等方面有着各自的优势。其中,PHP是一种流行的服务器端脚本语言,适用于Web应用和互联网开发,而Golang则是一种静态类型、编译型语言,适用于大规模分布式系统和高并发...
    99+
    2023-05-16
  • golang cookie请求
    Golang 中发起 HTTP 请求时通常会需要使用 Cookie 等认证信息,同时也需要获取 Cookie。本文将介绍如何使用 Golang 发起带有 Cookie 的 HTTP 请求,并将 Cookie 保存到变量中供后续使用。HTTP...
    99+
    2023-05-21
  • golang delete请求
    随着互联网的快速发展,Web应用程序变得越来越流行。而随着Web应用程序和互联网的快速发展,越来越多的开发人员将目光投向了使用Go编程语言。Go作为一种高效、简单和易于学习的编程语言,其在Web应用程序开发领域中的表现备受好评。其中,使用g...
    99+
    2023-05-22
  • golang 异步请求
    随着互联网的快速发展,越来越多的应用需要与外部服务交互,而这些服务所提供的 API 往往都是异步的。在单线程的程序中,同步请求往往会造成程序的堵塞,影响程序的性能和响应速度。因此,在异步请求方面,golang 这门语言的独特设计可以让我们更...
    99+
    2023-05-18
  • golang并发请求
    在当今的互联网时代,快速、高效地请求和处理数据是所有程序开发人员的必备技能。而并发请求是实现这一目标的有效方法之一。本文将介绍golang中如何实现并发请求。一、什么是并发请求并发请求指的是同时向多个服务器发送请求,以加快数据请求和处理速度...
    99+
    2023-05-21
  • golang发送请求
    Go是一种开源的编程语言,它非常适合编写高效、可靠、并发的网络应用。由于其卓越的性能和容易编写的特性,Go已经成为了许多应用程序的首选编程语言。在本文中,我们将介绍如何使用Go发送HTTP请求。首先引入net/http包在Go中发送HTTP...
    99+
    2023-05-21
  • golang请求计数
    Golang是一种被广泛使用的编程语言,特别是在网络应用程序方面。在构建网络应用程序时,经常需要进行请求计数。请求计数将帮助我们跟踪应用程序的请求量,识别任何潜在的性能问题或安全问题,使运维和开发人员更容易了解应用程序。本文将介绍如何使用G...
    99+
    2023-05-19
  • golang 并发请求
    在现代化的Web应用中,网络请求是至关重要的部分。通过网络请求,我们可以轻松地获取和发送数据。但是,随着应用规模的不断扩大,请求的数量也会增加。在这种情况下,如何保证系统的稳定性和效率就变得尤为重要。Go语言是一种高效的并发编程语言,具有良...
    99+
    2023-05-19
  • golang 登录请求
    随着互联网的不断发展,越来越多的服务需要用户登录才能使用,因此登录功能成为了每个Web应用必须具备的功能之一。使用Golang开发登录功能,可以有效提高运行效率和可维护性。Golang(也被称为Go)是由谷歌开发的一种开源编程语言,自推出以...
    99+
    2023-05-16
  • golang 发起请求
    Golang是一种快速、简单、安全的编程语言,广泛用于Web应用程序的开发。在Golang中发起HTTP请求是一个很常见的任务,本文将介绍如何在Golang中发起HTTP请求。使用标准库Golang的标准库中包含了net/http包,提供了...
    99+
    2023-05-16
  • golang http请求头
    Golang是一门流行的编程语言,用于构建高性能网络应用程序。在开发网络应用程序时,HTTP请求头是必不可少的一部分,它提供了关于请求的信息,以及指示如何应处理该请求的指令。本文将探讨Golang中HTTP请求头的相关内容,包括什么是HTT...
    99+
    2023-05-14
  • Golang请求fasthttp实践
    目录基础API演示 高性能API演示测试服务 Golang单元测试 测试报告 原计划学完Golang语言HTTP客户端实践之后,就可以继续了,没想到才疏学浅,在搜资料的时候发现除了G...
    99+
    2022-11-12
  • golang 接受http请求
    Golang是一种高效而又简洁的编程语言,它的应用范围非常广泛。在Web开发方面,Golang的高效、并发等特性赋予了它强大的能力,因此Golang成为了Web开发的一种热门技术之一。本文将解析如何使用Golang来接收HTTP请求。一、H...
    99+
    2023-05-15
  • golang 读取请求body
    在使用Golang进行Web开发时,有时候需要读取HTTP请求的body部分(例如POST请求中携带的提交数据),以便进行处理。本文将介绍Golang如何读取HTTP请求的body。一、使用ioutil.ReadAll()读取Golang标...
    99+
    2023-05-15
  • golang gin请求统计
    随着Web应用程序的发展,人们对性能和代码优化的需求也越来越高。在这种情况下,对请求的监控和统计变得尤为重要。 这篇文章将介绍如何使用Golang和Gin框架来实现请求统计功能。背景在Web应用程序中,遇到以下情况可能会导致性能问题:频繁地...
    99+
    2023-05-14
  • golang 接收get请求
    Go语言(Golang)的标准库提供了处理HTTP请求的功能,这使得将Go用于web应用程序变得非常容易。在本文中,我们将讨论如何使用Go编写HTTP服务器来接收GET请求。我们将首先讨论如何使用Go创建HTTP服务器,然后介绍处理Get请...
    99+
    2023-05-14
  • Golang如何请求fasthttp
    小编给大家分享一下Golang如何请求fasthttp,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!基础API演示首先分享一下基础的用法封装:PS:这个属于练习版本,所以没写多少注释。package ftimpo...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作