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

Есть достаточно много программ для использования WOL, но сегодня мы напишем свою на Visual C#. Точнее даже не то что бы программу а «каркас» который при небольшой доработке можно превратить в полноценный программный продукт.

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

 

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

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

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

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

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);
        }

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

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 вызвав консоль:

c-sharp-and-wol-2

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

 

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

 

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

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