Программа "Wake on LAN"

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Отчёт по курсовой работе

Программа «Wake on LAN»

Введение

Программа «Wake On LAN» представляет собой Windows-приложение, предназначенное для включения удалённого компьютера по заранее известному IP-адресу. Также в ней включена поддержка удалённого рабочего стола включённого компьютера и возможность его выключения.

Эту программу целесообразно использовать администраторам для включения определённых компьютеров в сети и управления ими, а также пользователям, которым нужно зайти на свой компьютер со статичным IP-адресом удалённо, например, для того, чтобы взять с его винчестера забытый файл, а потом благополучно его выключить.

Настройка компьютера

Для того чтобы полноценно воспользоваться функцией удаленного включения необходимо:

— Материнская плата, поддерживающая WoL (Wake-On-LAN);

— Блок питания стандарта ATX;

— Сетевая карта или модем, поддерживающие управление электропитанием;

— Компьютер, выключенный в режиме Soft-OFF (именно в этот режим он переходит через пуск, после нажатия кнопки включения на корпусе/клавиатуре, выключения всеми возможными программными средствами).

Процесс настройки WoL начинается с включения ее в BIOS’е:

/

/

Затем нужно включить управление электропитания для сетевого адаптера

/

/

Теперь компьютер можно включить с помощью Wake on LAN, но для того, чтобы воспользоваться удалённым доступом к этому компьютеру, нужно включить данную опцию в свойствах компьютера и соответствующую службу:

Управляемый компьютер находится в дежурном режиме (stand by) и выдаёт питание на сетевой адаптер. Сетевой адаптер находится в режиме пониженного энергопотребления, просматривая все пакеты, приходящие на его MAC-адрес и ничего не отвечая на них. Если одним из пакетов окажется Magic Packet, сетевой адаптер выдаёт сигнал на включение питания компьютера.

Описание работы программы

1. Определение MAC-адреса по IP-адресу компьютера через посылку тестового пакета через сокеты.

2. Если MAC-адрес найден, то программа записывает его и соответствующий IP-адрес в текстовый файл arp. txt; в противном случае программа ищет MAC-адрес по IP-адресу в этом текстовом файле.

3. Формируется «магический пакет» из 6 байт FF, а затем -- MAC-адреса сетевой платы, повторённого 16 раз. То есть, если бы адрес платы выглядел как 01: 02:03:04:05:06, то магический пакет оказался бы таким:

FFFFFFFFFFFF010203040506010203040506010203040506010203040506

10 203 040 506 010 202 992 305 997 503 060 842 228 256 382 125 364 916 256 768

10 203 040 506 010 202 992 305 997 503 060 842 228 256 382 125 364 916 256 768

10 203 040 506 010 203 586 560

4. Посылка «магического пакета» на MAC-адрес пробуждаемого компьютера.

5. Далее возможно подключение к удалённому рабочему столу.

6. Также возможно выключение компьютера.

При запуске программы появляется окно:

Пользователю нужно ввести IP-адрес компьютера, который он собирается включить, и по кнопке «Запуск» этот компьютер включится, если он есть в сети, удовлетворяет требованиям настройки, и будет найден его MAC-адрес, в противном случае на экран будет выведено сообщение с указанием причины отказа запуска.

Если всё прошло удачно, то MAC-адрес включённого компьютера выведется в текстовое поле «MAC-адрес» и появятся кнопки «Подключение к удалённому рабочему столу» и «Выключение удалённого компьютера».

После нажатия кнопки «Запуск» необходимо подождать несколько минут (2−5), чтобы на удалённом компьютере загрузилась операционная система и стало возможно подключение к удалённому рабочему столу.

По нажатию кнопки «Подключение к удалённому рабочему столу» вызывается соответствующая служба:

Для подключения к удалённому рабочему столу необходимо ввести логин и пароль администратора удалённого компьютера.

Теперь пользователь может работать на удалённом компьютере и после окончания работы нужно вернуться к рабочему столу локального компьютера и в нашей программе нажать кнопку «Выключение удалённого компьютера».

Список файлов, составляющих проект

Файлы заголовков:

PowerOn.h — описание классов синхронизации файлов.

PowerOnDlg.h — описание класса диалогового окна настроек.

resource.h — файл определения констант для диалогового окна.

stdafx.h — включаемый файл для стандартных системных включаемых файлов.

Файлы исходного кода:

PowerOn. cpp — описание методов классов синхронизации.

PowerOnDlg. cpp — файл реализации.

stdafx. cpp — исходный файл, содержащий стандарт, включающий PowerOn. pch.

Файлы ресурсов:

PowerOn. rc2 — файл ресурсов проекта.

PowerOn. ico — иконка программы.

Структура классов

удаленный компьютер программа

Главным классом является класс диалогового окна CPowerOnDlg, который содержит все необходимые переменные и методы. Их более подробное описание приведено ниже:

class CPowerOnDlg: public CDialog

{

// Construction

public:

CPowerOnDlg (CWnd* pParent = NULL); // стандартный конструктор

//{{AFX_DATA (CPowerOnDlg)

enum { IDD = IDD_POWERON_DIALOG };

CString m_mac; //C-строка содержащая MAC-адрес

CIPAddressCtrl m_ip; //IP-адрес

CButton OnRemote; //Кнопка «Подключение к удалённому рабочему столу»

CButton OnShutdown; //Кнопка «Выключение удалённого компьютера»

CString ip; //C-строка содержащая IP-адрес

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL (CPowerOnDlg)

protected:

virtual void DoDataExchange (CDataExchange* pDX); //поддержка DDX/DDV

//}}AFX_VIRTUAL

// Реализация

protected:

HICON m_hIcon;

// Созданные функции схемы сообщений

//{{AFX_MSG (CPowerOnDlg)

virtual BOOL OnInitDialog ();

afx_msg void OnSysCommand (UINT nID, LPARAM lParam);

afx_msg void OnPaint ();

afx_msg HCURSOR OnQueryDragIcon ();

//}}AFX_MSG

DECLARE_MESSAGE_MAP ()

private:

CString GetMac (); //Функция получения MAC-адреса

UINT HexStrToInt (CString hexStr); //Переводит Cstring, содержащую шестнадцатиричныое число, в int

public:

afx_msg void OnIpnFieldchangedIpaddress1(NMHDR *pNMHDR, LRESULT *pResult);

afx_msg void OnPowerOn (); // Функция включения удалённого компьютера

afx_msg void OnBnClickedButton (); //Функция включения удалённого рабочего стола

afx_msg void OnBnClickedButton2(); // Функция выключения удалённого компьютера

};

Иходный текст главных функций класса CPowerOnDlg

//Получает MAC-адрес…

CString CPowerOnDlg: :GetMac ()

{

//Будем использовать сокеты

m_mac="";

CString _mac;

UpdateData (FALSE);

WSADATA WsaData;

BYTE field[4];

m_ip. GetAddress (field[0], field[1], field[2], field[3]);

ip="";

CString c_f[4];

for (int j=0; j< 4; j++)

{

c_f[j]. Format («%i», field[j]);

ip+=c_f[j];

if (j< 3) ip+=". «;

}

DWORD _ip=inet_addr (ip);

if (WSAStartup (0×0202, & WsaData)≠NULL)

MessageBox («WSA не запущено!»);

//Создаём UDP-сокет и отсылаем по нему любые данные

CAsyncSocket udp_s;

udp_s. Create (40 000,SOCK_DGRAM);

SOCKADDR_IN udp_sin;

BOOL bOptVal = TRUE;

if (udp_s. SetSockOpt (SO_BROADCAST,(char*)&bOptVal, sizeof (BOOL))≠SOCKET_ERROR)

{

udp_sin. sin_family = AF_INET;

udp_sin. sin_port = htons (5232); //Шлём на любой порт.

udp_sin. sin_addr. s_addr = _ip;

if (udp_s. SendTo («TEST», 5,(SOCKADDR*)& udp_sin, sizeof (udp_sin), NULL)> 0)

{ //Пакет отослан. Вытаскиваем MAC-адрес из системы

MIB_IPNETTABLE * pIpNetTable = (MIB_IPNETTABLE *) new char[0xFFFF];

ULONG cbIpNetTable = 0xFFFF;

if (NO_ERROR == GetIpNetTable (pIpNetTable, & cbIpNetTable, TRUE))

{

for (DWORD i = 0; i < pIpNetTable-> dwNumEntries; i++)

{

if (pIpNetTable-> table[i]. dwAddr==_ip&&pIpNetTable->table[i]. dwType≠2)

{

CString strTMP;

BYTE* _m=(BYTE*)& pIpNetTable->table[i]. bPhysAddr;

for (int j=0; j< 6; j++)

{

strTMP. Format («%02X»,*_m++);

m_mac+=strTMP;

_mac+=strTMP;

if (j< 5) m_mac+="-«;

};

UpdateData (FALSE);

delete[] pIpNetTable;

udp_s. Close ();

WSACleanup ();

//Проверяем есть ли такой IP в файле

std: :ifstream file («arp. txt»);

char tmp_ip[16];

char tmp_mac[13];

bool fflag = false;

while (!file. eof ())

{

file > > tmp_ip > > tmp_mac;

if (tmp_ip == ip)

{

fflag = true;

break;

}

}

file. close ();

if (!fflag) //Записываем IP и соответствующий MAC-адрес в конец файла

{

std: :ofstream file («arp. txt», std: ios:app);

file < < ip < < «» < < _mac < <"n";

file. close ();

}

return _mac;

}

}

}

else MessageBox («Ошибка таблицы IPMAC!»);

}

else MessageBox («Ошибка данных!»);

}

else MessageBox («Ошибка сокетов!»);

udp_s. Close ();

WSACleanup (); //Освобождаем ресурсы

//ищем MAC-адрес в файле

std: :ifstream file («arp. txt»);

char tmp_ip[16];

char tmp_mac[13];

bool fflag = false;

do

{

file > > tmp_ip > > tmp_mac;

if (tmp_ip==ip)

{

fflag = true;

break;

}

}while (!file. eof ());

file. close ();

if (!fflag)

{

MessageBox («MAC-адрес не найден»);

return ««;

}

else

{

_mac = tmp_mac;

m_mac = tmp_mac;

for (int i=5; i>0;i--)

m_mac. Insert (2*i,"-«);

UpdateData (FALSE);

return _mac;

}

};

//----------------------------------------------

//Включает удалённный компьютер

void CPowerOnDlg: :OnPowerOn ()

{

//Получаем MAC адрес

CString macAddr = GetMac ();

if (macAddr=="") return;

//Будем использовать сокеты

CAsyncSocket s;

//Инициализируем «магический пакет»

BYTE magicP[102];

//Первые 6 байт 0xFF

for (int i=0; i<6;i++)

magicP[i] = 0xff;

//Заполняем 6−12 байты MAC-адресом

for (int i=0; i<6;i++) {

magicP[i+6] = HexStrToInt (macAddr. Mid (i*2,2));

}

//заполняем оставшиеся 90 байт MAC-адресом

for (int i=0; i<15;i++) memcpy (& magicP[(i+2)*6],&magicP[6], 6);

//Создаём сокет для отправки данных

s. Create (40 000,SOCK_DGRAM);

//Настраиваем сокет для передачи пакета

BOOL bOptVal = TRUE;

if (s. SetSockOpt (SO_BROADCAST,(char*)&bOptVal, sizeof (BOOL))==SOCKET_ERROR)

return;

//Отправка магического пакета

s. SendTo (magicP, 102,40 000);

TRACE (_T («Магический пакет отправлен. Удалённый компьютер должен включится. «));

//Выключаем сокеты и освобождаем буфер

s. Close ();

//Делаем видимой кнопку включения удалённого рабочего стола

OnRemote. ShowWindow (TRUE);

OnShutdown. ShowWindow (TRUE);

}

//----------------------------------------------

//Переводит Cstring, содержащую шестнадцатиричныое число, в int

UINT CPowerOnDlg: :HexStrToInt (CString hexStr)

res==0)

return 0;

return res;

//----------------------------------------------

//Функция включения удалённого рабочего стола

void CPowerOnDlg: :OnBnClickedButton ()

{

CString param («/v: «);

param += ip;

ShellExecute (NULL,"open","mstsc. exe", param,"C:WINDOWSsystem32″, SW_SHOWNORMAL);

}

//----------------------------------------------

//Функция выключения компьютера

void CPowerOnDlg: :OnBnClickedButton2()

{

CString param («-s -m «);

param += ip;

ShellExecute (NULL,"open","shutdown. exe", param,"C:WINDOWSsystem32″, SW_SHOWNORMAL);

}

Заключение и полезная ссылка

Данная программа полезна для получения базовых знаний о сокетах и MFC.

Полезные ссылки:

http: //citforum. ru/book/cook/winsock. shtml

http: //msdn. microsoft. com/ru-ru/default. aspx

ПоказатьСвернуть
Заполнить форму текущей работой