首页 文章

C#无法使用UdpClient接收WOL包

提问于
浏览
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)或不同的“协议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 回答

  • 1

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

    EDIT:

    在检查了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 .

相关问题