- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在我的 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# 应用程序中)一个 Broadcasted UDP MagicPackage,我上面的代码会收到这个包。这个 MagicPackage 在 Wireshark 中显示如下: http://i.stack.imgur.com/tPU1v.png
所以我不能 100% 确定问题是不同的“目标”(192.168.1.254 与 255.255.255.255)还是不同的“协议(protocol)”(WOL 与 UDP)。我的猜测是,UdpClient 忽略了 WOL 包,因为它的目的地(在 IP header 内)是一个不同的 IP 地址(代码在机器 192.168.1.2 上运行)。另一方面,第二个包的 IP header 中的目标地址为“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);
最佳答案
检查此属性: 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,但您的操作系统期望 ...1.2,因此 IP 堆栈将抛出此数据包,您的应用程序将不会收到任何信息。另一端的 Wireshark 将网卡切换到“混杂模式”,在该模式下所有过滤器均关闭,wireshark 能够捕获所有内容。所以要解决这个问题:
1) 您可以使用一些捕获库实现与 Wireshark 类似的行为 - 查看 WinPCAP - http://www.winpcap.org/
2) 尝试使用 RAW 套接字,但我不确定这是否有效 - http://en.wikipedia.org/wiki/Raw_socket
3) 最好的方法是修复您的路由器以发送标准格式的 WOL。
关于C# 无法使用 UdpClient 接收 WOL 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922122/
我想检测是否可以进行局域网唤醒。 在我的路由器(Tomato 固件)上有一个包含信息的表格 - 当显示设备“事件(在 ARP 中)”时 - 可以通过 WOL(离线 Linux 电脑)打开该设备。 我想
不久前,我 [在 Google 的帮助下] 写了一个小的 WOL 脚本来打开我网络中的计算机。这是脚本: exec /usr/bin/python -x "$0" "$@" # node_lst =
我正在尝试在我的 C# 应用程序中接收 WOL 包。我想它为什么不起作用的问题与我运行 DD-WRT 的路由器如何广播包有关。 我用来接收UDP包的代码: UdpClient udp = new
我有一台工作中的计算机,有时我会从家里醒来以便访问它,但是当启动并从我们的 DHCP 服务器获取另一个 IP 地址时,我该如何访问它? 情况和我的“工作流程”如下: 我从家里的 PC 连接到办公室的
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我试图在所有接口(interface)上发送一个 WOL 包以唤醒网关(这是 DHCP 服务器,所以机器还没有 IP)。 而且我似乎只能将套接字绑定(bind)到 IP 和端口对... 所以问题是:如
你能给我完整的代码来通过网卡和 BIOS 的 WOL 选项打开联网计算机吗? 请提供所有详细信息并尝试给我工作代码。 最佳答案 using System; using System.Net.Socke
我想知道是否可以检查 WOL-request 是否已经 在计算机已开启的情况下收到。 (pInvoke,c#?) 如果计算机收到magic paket 并启动,Windows 会将相应的事件日志条目写
我是一名优秀的程序员,十分优秀!