使用C#实现Wake on LAN的最佳方法是什么?
LAN环境中的计算机需要该功能(而不是通过Internet).该方法需要足够健壮以处理防火墙和其他此类问题.此外,对于不支持此功能或禁用此功能的系统,还有其他选择吗?
主要目标 - 通过LAN唤醒机器(从关闭/休眠状态) - 这是使用C#编程.
请指导.
PS:我遇到过以下情况:
但是,我是新手,因此无法确定解决方案是否足够全面.如果有人可以推荐上述任何一篇文章,那会有所帮助.
Oli*_*ver 12
对于WOL问题,您必须澄清三个问题才能使其工作:
正如您已经在网上找到的那样,现有几种解决方案可以解决C#中编程的第一个问题(在浏览完链接之后我将从第一个问题开始).
第二个是您只能通过配置网络适配器来实现的.只需打开设备管理器并查看网络适配器的属性(如果存在这样的选项并且您可以启用它).这是无法编程的,因为每个网络适配器都具有该功能的另一个实现以及如何启用它.
C#也无法解决第三个问题.这是一个纯粹的网络问题,您必须配置路由器,网关,ID系统等,以允许此类数据包并让它从发送方流向接收方.由于WOL数据包始终是广播数据包(dest-ip 255.255.255.255),因此它不会离开您的本地网络,并且将始终从路由器,网关或网络之间的任何其他网桥(例如,vpns,等等.).
最后但并非最不重要的是,我只会提醒您,第一个问题可以分为一些较小的数据包,但据我所知,这些问题都受到您提供的链接的限制.
Pou*_*Bak 12
很老的问题,我知道,但仍然有效。由于我在接受的答案中没有看到任何 C#,因此我编写了自己的“Wake On Lan”代码。
我的目标是制作一个通用且简单的Wake On Lan class
:
如何使用:
所有你需要的,是MAC地址的的有线要唤醒计算机上的网卡。任何标准的十六进制表示都可以。然后像这样调用代码:
string mac = "01-02-03-04-05-06";
await WOL.WakeOnLan(mac);
Run Code Online (Sandbox Code Playgroud)
这是课程:
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
public static class WOL
{
public static async Task WakeOnLan(string macAddress)
{
byte[] magicPacket = BuildMagicPacket(macAddress);
foreach (NetworkInterface networkInterface in NetworkInterface.GetAllNetworkInterfaces().Where((n) =>
n.NetworkInterfaceType != NetworkInterfaceType.Loopback && n.OperationalStatus == OperationalStatus.Up))
{
IPInterfaceProperties iPInterfaceProperties = networkInterface.GetIPProperties();
foreach (MulticastIPAddressInformation multicastIPAddressInformation in iPInterfaceProperties.MulticastAddresses)
{
IPAddress multicastIpAddress = multicastIPAddressInformation.Address;
if (multicastIpAddress.ToString().StartsWith("ff02::1%", StringComparison.OrdinalIgnoreCase)) // Ipv6: All hosts on LAN (with zone index)
{
UnicastIPAddressInformation unicastIPAddressInformation = iPInterfaceProperties.UnicastAddresses.Where((u) =>
u.Address.AddressFamily == AddressFamily.InterNetworkV6 && !u.Address.IsIPv6LinkLocal).FirstOrDefault();
if (unicastIPAddressInformation != null)
{
await SendWakeOnLan(unicastIPAddressInformation.Address, multicastIpAddress, magicPacket);
break;
}
}
else if (multicastIpAddress.ToString().Equals("224.0.0.1")) // Ipv4: All hosts on LAN
{
UnicastIPAddressInformation unicastIPAddressInformation = iPInterfaceProperties.UnicastAddresses.Where((u) =>
u.Address.AddressFamily == AddressFamily.InterNetwork && !iPInterfaceProperties.GetIPv4Properties().IsAutomaticPrivateAddressingActive).FirstOrDefault();
if (unicastIPAddressInformation != null)
{
await SendWakeOnLan(unicastIPAddressInformation.Address, multicastIpAddress, magicPacket);
break;
}
}
}
}
}
static byte[] BuildMagicPacket(string macAddress) // MacAddress in any standard HEX format
{
macAddress = Regex.Replace(macAddress, "[: -]", "");
byte[] macBytes = new byte[6];
for (int i = 0; i < 6; i++)
{
macBytes[i] = Convert.ToByte(macAddress.Substring(i * 2, 2), 16);
}
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter bw = new BinaryWriter(ms))
{
for (int i = 0; i < 6; i++) //First 6 times 0xff
{
bw.Write((byte)0xff);
}
for (int i = 0; i < 16; i++) // then 16 times MacAddress
{
bw.Write(macBytes);
}
}
return ms.ToArray(); // 102 bytes magic packet
}
}
static async Task SendWakeOnLan(IPAddress localIpAddress, IPAddress multicastIpAddress, byte[] magicPacket)
{
using (UdpClient client = new UdpClient(new IPEndPoint(localIpAddress, 0)))
{
await client.SendAsync(magicPacket, magicPacket.Length, multicastIpAddress.ToString(), 9);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个怎么运作:
该代码的工作原理是枚举所有“启动”并连接到您的网络的网卡(通常只有一张)。它将使用多播向所有连接的网络发送“魔法数据包”,该多播适用于 ipv4 和 ipv6(不要担心网络泛滥,它只有 102 字节)。
为了工作,你想唤醒的计算机必须有有线连接(无线计算机不能被唤醒,因为它们没有连接到任何网络,当它们关闭时)。发送数据包的计算机可以无线连接。
防火墙通常没有问题,因为计算机已关闭,因此防火墙未处于活动状态。
你必须确保'Wake on lan'
是enabled
在计算机BIOS
和网络卡上。
我正在尝试 Poul Bak\xc2\xb4s 答案,但无法唤醒我的目标计算机。在验证第三方应用程序WakeMeOnLan实际上能够唤醒我的目标计算机后,我编写了这段对我有用的代码:
\nvoid SendWakeOnLan(PhysicalAddress target)\n{ \n var header = Enumerable.Repeat(byte.MaxValue, 6);\n var data = Enumerable.Repeat(target.GetAddressBytes(), 16).SelectMany(mac => mac);\n\n var magicPacket = header.Concat(data).ToArray();\n \n using var client = new UdpClient();\n\n client.Send(magicPacket, magicPacket.Length, new IPEndPoint(IPAddress.Broadcast, 9));\n}\n
Run Code Online (Sandbox Code Playgroud)\n用法:
\n只需传入目标计算机的 MAC 地址,如下所示:
\nSendWakeOnLan(PhysicalAddress.Parse("0A-0B-0C-0D-0E-0F"));\n
Run Code Online (Sandbox Code Playgroud)\n我认为这个答案和 Poul Bak\xc2\xb4s 答案之间的主要区别在于,该代码使用 IPv4 上的广播而不是 IPv4/IPv6 上的多播,并且也许我的网络设备没有处理/设置来正确执行多播。
\n 归档时间: |
|
查看次数: |
11823 次 |
最近记录: |