Golang Go语言中能否使用无 ipv4 的网卡发送 UDP 数据包?

发布于 1周前 作者 itying888 来自 Go语言

我使用网线将 N1 和台式机直连,N1 未设置静态 IP ,有 eth0 、wlan0 两个网卡。

eth0 网卡信息如下:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether de:93:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 3179  bytes 737340 (720.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23709  bytes 4419840 (4.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 20  

我想使用 eth0 网卡发送 Wake-on-LAN 魔术包,做了以下尝试均无法唤醒主机,我猜测是因为 eth0 网卡没有 ipv4 ip 导致,我想问下能否使用上面 eth0 网卡发送 UDP 数据包?

尝试一:
inf, err := net.InterfaceByName("eth0")
addrs, err := inf.Addrs()//此处 addrs 为空切片
var localAddr = &net.UDPAddr{
	IP: addrs[0].(*net.IPNet).IP,
}
conn, err := net.DialUDP("udp", localAddr, udpAddr)

尝试二:(让系统自己选择本地地址) conn, err := net.DialUDP(“udp”, nil, udpAddr)

(ps:同样环境下使用 etherwake 可以唤醒主机,所以很郁闷)


Golang Go语言中能否使用无 ipv4 的网卡发送 UDP 数据包?

更多关于Golang Go语言中能否使用无 ipv4 的网卡发送 UDP 数据包?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

你没有 IPv4 的 localAddr ,所以不能直接用 udp 。
你必须构造一个以太网包,源 ip 填 0 试试。

更多关于Golang Go语言中能否使用无 ipv4 的网卡发送 UDP 数据包?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


试试用 gopacket 这个包,构建一个 UDP 包直接发送。

如果我没记错的话,发这种 WoL 包是要用 SOCK_RAW socket 直接构造 UDP 包的,不能走系统的 UDP 协议栈,所以基于 SOCK_DGRAM 的 UDP 封装应该不能用。

没用过 Wake-on-LAN 不清楚,但是没有 IP 的话应该只能走数据链路层了吧。

wol 不是直接用 mac 发的包么

下面是我用 python+fastapi+socket 实现的外网开机
主要是构建一个 UDP 的数据包,发给路由器,路由器做了端口转发,会 NAT 转成电脑网卡的 MAC 地址,然后就开机了。
python<br>.get('/电脑开机')<br>def wakeonlan():<br> import socket<br> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)<br> data = 'ff' * 6 + 'd85ed3454fe1' * 16<br> s.sendto(bytes.fromhex(data), ('<a target="_blank" href="http://xxxx.xxddns.cn" rel="nofollow noopener">xxxx.xxddns.cn</a>', 7))<br> s.close()<br> return PlainTextResponse('成功')<br>

WOL 是涉及不到三层( IP 层面)的,只到二层(数据链路层)因为电脑关机的时候网卡

#1 试了源 ip 填 0 ,无法唤醒

#2
#6 我去看看 gopacket 怎么使用

#3 我在 Github 上搜到三个 go 写的 wol 相关的项目,都是发送的 UDP 数据包。我试了本机运行网卡灯是会闪一下的,我现在的情况确实不适合使用 UDP 来发

#4 是这样的,思路没打开

#5 是直接发含 mac 地址的包,但是之前往哪儿发、怎么发不太清楚

#7 正在安装 python 环境,准备跑一波,你的代码也太简洁了!卧槽奉上

#9 这正是我想要的代码,亲测可用

感谢各位大佬的热心帮助!

数据包是一样的,ff6+macaddr16

我想问下这个是干嘛用的?局域网唤醒主机?

#12 是的,配合公网 IP 或者内网穿透就可以实现远程开机

在Golang(Go语言)中,使用无IPv4地址的网卡发送UDP数据包是可能的,但具体实现方式和可行性取决于操作系统和网络配置。

Go语言的标准库net提供了对UDP协议的支持,允许你指定发送和接收数据包的本地和远程地址。通常情况下,当你尝试绑定一个UDP socket到某个网络接口时,你需要提供一个有效的IP地址。然而,如果你的网卡没有IPv4地址,但支持IPv6,你可以尝试使用IPv6地址来绑定和发送数据包。

在某些情况下,如果操作系统和网络配置允许,即使没有为网卡分配IPv4地址,也可能可以通过不指定本地地址(即使用空地址或通配符地址,如0.0.0.0::)来发送UDP数据包。这通常意味着数据包将由操作系统路由到适当的网络接口。

然而,如果确实需要在没有IPv4地址的网卡上发送UDP数据包,并且该网卡仅支持IPv6,则应该使用IPv6地址进行操作。你可以通过指定IPv6地址来创建UDP连接,并发送数据包。

请注意,网络编程中的具体行为可能因操作系统和网络配置的不同而有所差异。因此,在实际应用中,建议进行充分的测试和验证,以确保你的程序能够在目标环境中正确运行。

总之,虽然理论上可以在没有IPv4地址的网卡上发送UDP数据包,但具体实现需要根据你的网络环境和操作系统配置进行调整。

回到顶部