C# 用C语言实现局域网唤醒#

C# 用C语言实现局域网唤醒#,c#,wake-on-lan,C#,Wake On Lan,使用C#实现局域网唤醒的最佳方式是什么 LAN环境(而不是internet)中的机器需要此功能。该方法需要足够健壮,以处理防火墙和其他此类问题。此外,对于不支持此功能或已禁用此功能的系统,是否有替代方案 主要目标是通过LAN唤醒机器(从关机/休眠状态),这将使用C#进行编程 请导游 附言:我遇到了以下几点: 然而,我对这一点还不熟悉,因此无法判断解决方案是否足够全面。如果有人能推荐以下文章,那将很有帮助。对于WOL问题,您必须澄清三个问题才能使其正常工作: 通过以太网电缆发送WOL 配置您

使用C#实现局域网唤醒的最佳方式是什么


LAN环境(而不是internet)中的机器需要此功能。该方法需要足够健壮,以处理防火墙和其他此类问题。此外,对于不支持此功能或已禁用此功能的系统,是否有替代方案

主要目标是通过LAN唤醒机器(从关机/休眠状态),这将使用C#进行编程

请导游

附言:我遇到了以下几点:


  • 然而,我对这一点还不熟悉,因此无法判断解决方案是否足够全面。如果有人能推荐以下文章,那将很有帮助。

    对于WOL问题,您必须澄清三个问题才能使其正常工作:

  • 通过以太网电缆发送WOL
  • 配置您的电脑以侦听此类消息 一个包裹,然后醒来
  • 确保这个包是从哪里来的 发送方到接收方(防火墙, 网关等)
  • 正如你在网上已经发现的,对于用C#编程的第一个问题,有几种解决方案(在浏览了你的链接之后,我将从第一个开始)

    第二个是只有通过配置网络适配器才能实现的。只要打开设备管理器并查看网络适配器的属性,如果存在这样的选项,并且您可以启用它。这无法编程,因为每个网络适配器都有该功能的另一个实现以及如何启用它

    第三个问题也不能用C#来解决。这是一个纯粹的网络问题,您必须配置路由器、网关、ids系统等,以允许这样的数据包从发送方流向接收方。由于WOL数据包始终是广播数据包(dest ip 255.255.255.255),因此它不会离开您的本地网络,并且始终会从路由器、网关或网络之间的任何其他网桥(如VPN等)中丢弃


    最后但并非最不重要的一点是,我只想提醒您,第一个问题可以分为一些较小的数据包,但据我所知,这些问题都受到您提供的链接的限制。

    我知道,这是一个非常老的问题,但仍然有效。因为我在被接受的答案中没有看到任何C#,所以我编写了自己的“局域网唤醒”代码

    我的目标是打造一个通用且简单的局域网唤醒课程:

    • 适用于ipv4、ipv6和双栈
    • 使用连接到不同网络(两台计算机)的一个或多个网卡(NIC)
    • 使用任何标准十六进制格式的macaddress
    • 使用多播工作(使用多个NIC时,Windows中的广播有问题,使用ipv6时不支持广播)
    如何使用:

    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);
            }
        }
    }
    
    您所需要的只是希望唤醒的计算机上的有线网卡的MAC地址。任何标准的十六进制表示都可以。然后按如下方式调用代码:

    string mac = "01-02-03-04-05-06";
    await WOL.WakeOnLan(mac);
    
    这是课程:

    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);
            }
        }
    }
    
    使用系统;
    使用System.IO;
    使用System.Linq;
    Net系统;
    使用System.Net.NetworkInformation;
    使用System.Net.Sockets;
    使用System.Text.RegularExpressions;
    使用System.Threading.Tasks;
    公共静态类WOL
    {
    公共静态异步任务WakeOnLan(字符串macAddress)
    {
    字节[]magicPacket=BuildMagicPacket(macAddress);
    foreach(NetworkInterface.GetAllNetworkInterfaces()中的NetworkInterface NetworkInterface)。其中((n)=>
    n、 NetworkInterfaceType!=NetworkInterfaceType.Loopback&&n.OperationalStatus==OperationalStatus.Up))
    {
    IPInterfaceProperties IPInterfaceProperties=networkInterface.GetIPProperties();
    foreach(iPInterfaceProperties.MulticastAddresss中的MulticastIPAddressInformation MulticastIPAddressInformation)
    {
    IPAddress multicastIpAddress=multicastIPAddressInformation.Address;
    if(multicastIpAddress.ToString().StartsWith(“ff02::1%”,StringComparison.OrdinalIgnoreCase))//Ipv6:LAN上的所有主机(带区域索引)
    {
    UnicastIPAddressInformation UnicastIPAddressInformation=iPInterfaceProperties.UnicastAddresses.Where((u)=>
    u、 Address.AddressFamily==AddressFamily.InterNetworkV6&!u.Address.IsIPv6LinkLocal).FirstOrDefault();
    if(unicastIPAddressInformation!=null)
    {
    等待SendWakeOnLan(UnicastipAddress.Address,multicastIpAddress,MagicPackage);
    打破
    }
    }
    else if(multicastIpAddress.ToString().Equals(“224.0.0.1”)//Ipv4:局域网上的所有主机
    {
    UnicastIPAddressInformation UnicastIPAddressInformation=iPInterfaceProperties.UnicastAddresses.Where((u)=>
    u、 Address.AddressFamily==AddressFamily.InterNetwork&&!iPInterfaceProperties.GetIPv4Properties().IsAutomaticPrivateAddressingActive).FirstOrDefault();
    if(unicastIPAddressInformation!=null)
    {
    等待SendWakeOnLan(UnicastipAddress.Address,multicastIpAddress,MagicPackage);
    打破
    }
    }
    }
    }
    }
    静态字节[]BuildMagicPacket(字符串macAddress)//任何标准十六进制格式的macAddress
    {
    macAddress=Regex.Replace(macAddress,[:-],“”);
    字节[]macBytes=新字节[6];
    对于(int i=0;i<6;i++)
    {
    macBytes[i]=Convert.ToByte(macAddress.Substring(i*2,2),16);
    }
    使用(MemoryStream ms=new MemoryStream())
    {
    使用(BinaryWriter bw=新的BinaryWriter(ms))
    {
    对于(int i=0;i<6;i++)//第一个
    
    SendWakeOnLan(PhysicalAddress.Parse("0A-0B-0C-0D-0E-0F"));