【问题标题】:C# Unable to receive WOL package with UdpClientC# 无法使用 UdpClient 接收 WOL 包
【发布时间】:2012-10-16 19:31:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案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。

    【讨论】:

    • 谢谢,但我也已经尝试过了,它并没有改变任何东西。 :-(
    • 我无法使用原始套接字,但使用sourceforge.net/projects/sharppcap(winpcap 的.net 端口)我能够捕获数据包。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多