专业编程基础技术教程

网站首页 > 基础教程 正文

C#远程唤醒指定客户端代码 c#远程通讯

ccvgpt 2024-12-26 12:11:03 基础教程 1 ℃

客户端关闭后,下次再上课时,需要远程把机房中的电脑全部开机。原理应该就是向指定的mac地址发送一串东西,所以事先要知道对方的MAC地址,这个收集MAC的过程,我是让学生机启动以后就发到教师端来,然后用一个xml来记录。

using System.Net.Sockets;
using System.Net;
using System.Text.RegularExpressions;

namespace kaiji
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Thread go = null;

        private void button1_Click(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;

            go = new Thread(kaiji);
            go.IsBackground = true;
            go.Start();
        }

        void kaiji()
        {
            //把mac地址放在macstr这里,用*隔开
            string[] macs = macstr.Split('*');

            int length = macs.Length;
            for (int i = 0; i < length; i++)
            {
                string mac = macs[i];
                //如果不是mac地址,继续
                if (IsMAC(mac)) { continue; }

                //用label显示当前操作对象
                label1.Text = "正在向 " + mac + " 发送命令。";

                //开机 -----------------------------------------
                PowerON(mac, 6588);
            }

            this.Close();
        }
        bool IsMAC(string s)
        {
            Regex r = new Regex(@"^([0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F])#34;);
            if (r.IsMatch(s))
            {
                return true;
            }
            return false;
        }

        //开机代码
        void PowerON(string mactext, int port)
        {
            mactext = mactext.Replace("-", ":");
            string[] sl = mactext.Split(Convert.ToChar(":"));
            byte[] mac = new byte[6];
            for (int i = 0; i < 6; i++)
            {
                mac[i] = ConvertHexToBytes(sl[i]);
            }

            UdpClient client = new UdpClient();
            client.Connect(IPAddress.Broadcast, port);

            byte[] packet = new byte[17 * 6];

            for (int i = 0; i < 6; i++)
                packet[i] = 0xFF;

            for (int i = 1; i <= 16; i++)
                for (int j = 0; j < 6; j++)
                    packet[i * 6 + j] = mac[j];

            int result = client.Send(packet, packet.Length);
        }
        byte ConvertHexToBytes(string value)
        {
            int len = value.Length / 2;
            byte[] ret = new byte[len];
            for (int i = 0; i < len; i++)
                ret[i] = (byte)(Convert.ToInt32(value.Substring(i * 2, 2), 16));
            return ret[0];
        }
    }
}

说明:

//把mac地址放在macstr这里,用*隔开

C#远程唤醒指定客户端代码 c#远程通讯

string[] macs = macstr.Split('*');

这里的macs就是要开机的mac集合

//开机 -----------------------------------------

PowerON(mac, 6588);

注意:因为我的学生机是机房内的机器,所以我们在同一个网段,所以这里我的

UdpClient client = new UdpClient();

client.Connect(IPAddress.Broadcast, port);

是用的IPAddress.Broadcast,如果不在一个网段的话,这样是不行的,广播地址要改成目标IP的广播地址,假如目标IP在30段,

client.Connect(new byte[]{192.168.30.255}, port);

192.168.30.255就是目标机器的IP广播地址了。

Tags:

最近发表
标签列表