我正在尝试在我的 C# 应用程序中接收 WOL 包。我想为什么它不起作用的问题与我运行 DD-WRT 的路由器如何广播包有关。
我用来接收 UDP 包的代码:
UdpClient udp = new UdpClient(10);
IPEndPoint all = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
System.Diagnostics.Debug.Print("listening");
byte[] receivedBytes = udp.Receive(ref all);
System.Diagnostics.Debug.Print(Encoding.ASCII.GetString(receivedBytes));
}
这已经适用于我的旧路由器,但现在我运行了 DD-WRT,它必须像这样设置:我将端口 10 上的传入 UDP 包转发到(不存在的)IP 192.168.1.254 在路由器启动时执行命令“arp -i br0 -s 192.168.1.254 FF:FF:FF:FF:FF:FF”以广播在该 IP 上接收到的消息。此设置有效,每台机器都会收到一个魔术包,我可以从网络外部唤醒它们。
WireShark 能够捕获此包,但“udp.Receive(ref all);” 不是。这是发送到我的路由器的 WOL 包在 Wireshark 中的样子:http: //i.stack.imgur.com/nxaAP.png
另一方面,如果我(从我的 C# 应用程序中)发送广播的 UDP MagicPackage,我上面的代码会收到这个包。这个 MagicPackage 在 Wireshark 中显示如下:http: //i.stack.imgur.com/tPU1v.png
所以我不能 100% 确定不同的“目的地”(192.168.1.254 与 255.255.255.255)或不同的“协议”(WOL 与 UDP)是否是问题所在。我的猜测是,UdpClient 忽略了 WOL 包,因为它的目的地(在 IP 标头内)是不同的 IP 地址(代码在机器 192.168.1.2 上运行)。另一方面,第二个包的 IP Header 中的目标地址为“255.255.255.255”,因此被 UdpClient 捕获。
所以最大的问题是:如何设置一个同时接收路由器广播的 WOL 包的 UDP 侦听器?
顺便说一句:我也已经用这段代码试过了,但没有任何运气:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint iep = new IPEndPoint(IPAddress.Any, 10);
sock.Bind(iep);
byte[] data = new byte[1024];
int recv = sock.ReceiveFrom(data, ref iep);