Программа «Wake on LAN»
Теперь компьютер можно включить с помощью Wake on LAN, но для того, чтобы воспользоваться удалённым доступом к этому компьютеру, нужно включить данную опцию в свойствах компьютера и соответствующую службу: После нажатия кнопки «Запуск» необходимо подождать несколько минут (2−5), чтобы на удалённом компьютере загрузилась операционная система и стало возможно подключение к удалённому рабочему столу. Читать ещё >
Программа «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
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 («-sm »);
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