2

我正在尝试在我的 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);
4

1 回答 1

1

检查此属性: http: //msdn.microsoft.com/en-us/library/system.net.sockets.socket.enablebroadcast.aspx 我相信 WOL 数据包被广播。在这种情况下,它应该有所帮助。

编辑:

检查您的 Wireshark 屏幕截图后,我认为问题不在您的代码中。据我所知,网络堆栈中有很多过滤器。第一个是MAC过滤器。WOL 数据包将通过广播地址 ff:ff:ff.... 第二个过滤器在 IP 地址上。您的 WOL 数据包具有目标 IP ...1.254,但您的操作系统期望 ...1.2,因此 IP 堆栈将抛出此数据包,您的应用程序将不会收到任何内容。另一边的 Wireshark 将网卡切换到“混杂模式”,在这种模式下,所有过滤器都被关闭,wireshark 能够捕获所有内容。所以要解决这个问题:

1)您可以使用一些捕获库实现与 Wireshark 类似的行为 - 看看 WinPCAP - http://www.winpcap.org/

2) 尝试使用 RAW 套接字,但我不确定这是否有效 - http://en.wikipedia.org/wiki/Raw_socket

3) 最好的方法是修复您的路由器以标准格式发送 WOL。

于 2012-10-16T20:48:02.420 回答