C#无法使用UdpClient接收WOL包

时间:2012-10-16 19:31:06

标签: c# udp broadcast udpclient wake-on-lan

我正在尝试在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)或不同的“协议1”(WOL与UDP)。我的猜测是,UdpClient忽略了WOL包,因为它的目的地(在IP头内)是一个不同的IP地址(代码在机器192.168.1.2上运行)。另一方面,第二个包在其IP头中具有目的地址“255.255.255.255”,因此被UdpClient捕获。

所以最大的问题是:如何设置一个UDP侦听器,它还接收我的路由器广播的WOL包?

顺便说一句:我也已经尝试过这段代码,但没有任何运气:

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);

1 个答案:

答案 0 :(得分: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。