我正在尝试在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)或不同的“ Protocoll”(WOL与UDP)是问题所在。我的猜测是,UdpClient会忽略WOL软件包,因为它的目的地(在IP标头中)是一个不同的IP地址(代码在机器192.168.1.2上运行)。另一方面,第二个包的IP头中的目标地址为“ 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);

最佳答案

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

编辑:

检查您的Wireshark屏幕截图后,我认为问题不在您的代码中。据我所知,网络堆栈中有很多过滤器。第一个是MAC过滤器。由于广播地址ff:ff:ff ...,WOL数据包将通过。...第二个过滤器位于IP地址上。您的WOL数据包的目标IP为... 1.254,但是您的OS预期为... 1.2,因此IP堆栈将抛出此数据包,您的应用程序将不会收到任何信息。另一端的Wireshark将网卡切换为“混杂模式”,其中所有过滤器均已关闭,wireshark可以捕获所有内容。
所以要解决这个问题:

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

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

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

10-03 00:26