Wake-on-LAN на Visual C# (Удаленное включение компьютера по сети)

Дата публикации: 31-10-2011 | Автор: MelfisFettel | Рубрика: C#

Visual C# ответыНаверное именно лень помогла создать такие вещи как пульт дистанционного управления, машины, калькуляторы, компьютеры и всяческие приспособления для того что бы человек мог упростить себе жизнь. Сегодня попробуем упростить себе жизнь, включив компьютер дистанционно. Это особенно полезно, если компьютер находится в другом кабинете, на другом этаже или даже другом здании. Итак, Wake-on-LAN.

Wake-on-LAN (WOL — пробуждение по сигналу из локальной сети) — технология, позволяющая удалённо включить компьютер посредством отправки через локальную сеть специальным образом сформированного пакета данных, так называемого «magic packet». Этот пакет может быть вставлен в пакеты любых стандартных протоколов более высоких уровней, например, UDP или IPX.
Есть достаточно много программ для использования WOL, но сегодня мы напишем свою на Visual C#. Точнее даже не то что бы программу а «каркас» который при небольшой доработке можно превратить в полноценный программный продукт.

Запустим Visual C#, и создадим новый проект назвав его WakeUP. Кинем на форму один textBox и один компонент Button. Выглядеть все это будет вот так:

Wake On Lan Visual C#

Компонент textBox1 будет использоваться для ввода MAC адреса удаленного компьютера, который необходимо включить. А кнопка button1 будет выполнять процедуру «отправки сигнала»

Суть WOL заключается в том что бы отправить пакет сформированный определённым образом. В начале пакета идет так называемая «цепочка синхронизации»: 6 байт, равных 0xFF. Затем — MAC-адрес сетевой платы, повторённый 16 раз. Компьютер должен поддерживать включение по сети, проверьте наличие данной возможности в BIOS вашей материнской платы.


Напишем код нашей программы.

Добавим в класс (public partial class Form1 : Form) Новый класс вот такого вида:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class WOLClass : UdpClient
        {
            public WOLClass()
                : base()
            { }
            //Установим broadcast для отправки сообщений
            public void SetClientToBrodcastMode()
            {
                if (this.Active)
                    this.Client.SetSocketOption(SocketOptionLevel.Socket,
                                              SocketOptionName.Broadcast, 0);
            }
        }
public class WOLClass : UdpClient
        {
            public WOLClass()
                : base()
            { }
            //Установим broadcast для отправки сообщений
            public void SetClientToBrodcastMode()
            {
                if (this.Active)
                    this.Client.SetSocketOption(SocketOptionLevel.Socket,
                                              SocketOptionName.Broadcast, 0);
            }
        }

И саму функцию отправки пакета:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//MAC адрес должен выглядеть следующим образом: 013FA049
        private void WakeFunction(string MAC_ADDRESS)
        {
            WOLClass client = new WOLClass();
            client.Connect(new IPAddress(0xffffffff), 0x2fff); //Используем порт = 12287 
            client.SetClientToBrodcastMode();
            int counter = 0;
            //буффер для отправки
            byte[] bytes = new byte[1024];   
            //Первые 6 бит 0xFF
            for (int y = 0; y < 6; y++)
                bytes[counter++] = 0xFF;
            //Повторим MAC адрес 16 раз
            for (int y = 0; y < 16; y++)
            {
                int i = 0;
                for (int z = 0; z < 6; z++)
                {
                    bytes[counter++] = byte.Parse(MAC_ADDRESS.Substring(i, 2), NumberStyles.HexNumber);
                    i += 2;
                }
            }
 
            //Отправим магический пакет
            int reterned_value = client.Send(bytes, 1024);
        }
//MAC адрес должен выглядеть следующим образом: 013FA049
        private void WakeFunction(string MAC_ADDRESS)
        {
            WOLClass client = new WOLClass();
            client.Connect(new IPAddress(0xffffffff), 0x2fff); //Используем порт = 12287 
            client.SetClientToBrodcastMode();
            int counter = 0;
            //буффер для отправки
            byte[] bytes = new byte[1024];   
            //Первые 6 бит 0xFF
            for (int y = 0; y < 6; y++)
                bytes[counter++] = 0xFF;
            //Повторим MAC адрес 16 раз
            for (int y = 0; y < 16; y++)
            {
                int i = 0;
                for (int z = 0; z < 6; z++)
                {
                    bytes[counter++] = byte.Parse(MAC_ADDRESS.Substring(i, 2), NumberStyles.HexNumber);
                    i += 2;
                }
            }

            //Отправим магический пакет
            int reterned_value = client.Send(bytes, 1024);
        }

На обработчик события нажатия кнопки button1 напишем вызов написанной нами только что функции:

1
WakeFunction(textBox1.Text);
WakeFunction(textBox1.Text);

Весь код программы целиком:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Globalization;
 
 
namespace WakeUP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public class WOLClass : UdpClient
        {
            public WOLClass()
                : base()
            { }
            //Установим broadcast для отправки сообщений
            public void SetClientToBrodcastMode()
            {
                if (this.Active)
                    this.Client.SetSocketOption(SocketOptionLevel.Socket,
                                              SocketOptionName.Broadcast, 0);
            }
        }
 
 
        //MAC адрес должен выглядеть следующим образом: 013FA049
        private void WakeFunction(string MAC_ADDRESS)
        {
            WOLClass client = new WOLClass();
            client.Connect(new IPAddress(0xffffffff), 0x2fff); //Используем порт = 12287 
            client.SetClientToBrodcastMode();
            int counter = 0;
            //буффер для отправки
            byte[] bytes = new byte[1024];   
            //Первые 6 бит 0xFF
            for (int y = 0; y < 6; y++)
                bytes[counter++] = 0xFF;
            //Повторим MAC адрес 16 раз
            for (int y = 0; y < 16; y++)
            {
                int i = 0;
                for (int z = 0; z < 6; z++)
                {
                    bytes[counter++] = byte.Parse(MAC_ADDRESS.Substring(i, 2), NumberStyles.HexNumber);
                    i += 2;
                }
            }
 
            //Отправим магический пакет
            int reterned_value = client.Send(bytes, 1024);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            WakeFunction(textBox1.Text);
        }
 
        ////////////////////////////////////////////////
 
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Globalization;


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

        public class WOLClass : UdpClient
        {
            public WOLClass()
                : base()
            { }
            //Установим broadcast для отправки сообщений
            public void SetClientToBrodcastMode()
            {
                if (this.Active)
                    this.Client.SetSocketOption(SocketOptionLevel.Socket,
                                              SocketOptionName.Broadcast, 0);
            }
        }


        //MAC адрес должен выглядеть следующим образом: 013FA049
        private void WakeFunction(string MAC_ADDRESS)
        {
            WOLClass client = new WOLClass();
            client.Connect(new IPAddress(0xffffffff), 0x2fff); //Используем порт = 12287 
            client.SetClientToBrodcastMode();
            int counter = 0;
            //буффер для отправки
            byte[] bytes = new byte[1024];   
            //Первые 6 бит 0xFF
            for (int y = 0; y < 6; y++)
                bytes[counter++] = 0xFF;
            //Повторим MAC адрес 16 раз
            for (int y = 0; y < 16; y++)
            {
                int i = 0;
                for (int z = 0; z < 6; z++)
                {
                    bytes[counter++] = byte.Parse(MAC_ADDRESS.Substring(i, 2), NumberStyles.HexNumber);
                    i += 2;
                }
            }

            //Отправим магический пакет
            int reterned_value = client.Send(bytes, 1024);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WakeFunction(textBox1.Text);
        }

        ////////////////////////////////////////////////

    }
}

Теперь немножко о том как узнать MAC адрес сетевой карты удаленного компьютера.
Нажмем Win + R и введем туда cmd вызвав консоль:

Пропингуем целевой узел. Для этого нужно либо знать IP, либо Имя компьютера.

WOL MAC Visual C#

Теперь введем команду arp –a, и в ответ получим список IP адресов и сопоставленные с ними MAC адреса:

WOL MAC Visual C#

Теперь все что осталось сделать — это скомпилировать проект в Visual C#, запустить его и ввести в единственное поле на форме полученный MAC адрес целевого компьютера.

Немного расширив этот «скелет», на пример возможностью сохранять список соотношений MAC, IP и Имени компьютера можно получить вполне рабочее и крайне полезное приложение. Можно так же расширить программу возможностью сканирования диапазона IP адресов, получения соотношений MAC — IP автоматически, тем самым уменьшив количество ручной работы по добавлению MAC в список.

Скачать исходные файлы проекта можно тут.

Понравилась статья? Расскажи друзьям:


Комментариев (3)

Спасибо за труд конечно, но http://white55.narod.ru/wol.html
бери и пользуйся

Дело не в том что бы взять и пользоваться. Например взяв исходники и немного допилив, приделать WMI и еще пару фитч, можно сделать вполне адекватную программу сбора статистики, анализа и управления сетью. Статья не истина в последней инстанции, это лишь пример :)

NOD32 не пускает туда

Обсудить