- •Программирование электронных устройств
- •Содержание
- •1 Рекомендации по изучению дисциплины
- •Библиографический список
- •Контрольные вопросы
- •2 Программирование электронных устройств
- •2.1 Управляемые событиями программы
- •Контрольные вопросы
- •2.2 Визуализация цифровых данных
- •2.2.1 Вывод графической информации на дисплей
- •Int fnStyle;
- •If (g_pBrushes)
- •Void Diagram(hdc hDc, int X, int y, int r, bool fShadow, const float* pData, const Brush* pBrushes, unsigned int iNumOfPies)
- •If (fShadow)
- •Void DiagramPie(hdc hDc, int X, int y, int r, float s, float e, int fnStyle, colorref clrref, const char* szLabel)
- •If (!szLabel)
- •Void ShadyDiagram(hdc hDc, int X, int y, int r, int iShadowDepth, const float* pData, const Brush* pBrushes, unsigned int iNumOfPies)
- •Void winapi EndPaint( hwnd hWnd, paintstruct far *lpps);
- •Int winapi ReleaseDc( hwnd hwnd, hdc hdc );
- •Int fnStyle;
- •If (g_pBrushes)
- •Void ShadyDiagram(hdc hDc, int X, int y, int r, int iShadowDepth, const float* pData, const Brush* pBrushes, unsigned int iNumOfPies)
- •Void DiagramPie(hdc hDc, int X, int y, int r, float s, float e, int fnStyle, colorref clrref, const char* szLabel);
- •Вывод графической информации на принтер
- •HDevMode – идентификатор глобального блока памяти, содержащего структуру типа devmode, которая используется для инициализации параметров принтера.
- •Контрольные вопросы
- •Организация интерфейса пользователя
- •Int wmId;
- •InvalidateRect(hWnd, null, true);
- •InvalidateRect(hWnd, null, true);
- •If (g_iShape)
- •Контрольные вопросы
- •2.4 Сетевое программирование
- •2.4.1 Сетевые модели, протоколы и архитектура «клиент – сервер»
- •Windows Sockets
- •If (gethostname(szInfo,sizeof(szInfo)))
- •Void Stop();
- •InvalidateRect(hWnd, null, true);
- •Void Stop()
- •If (wsaCleanup())
- •Void OnServerAccept(wparam, lparam);
- •InvalidateRect(hWnd, null, true);
- •Void OnServerAccept(wparam wParam, lparam lParam)
- •Int error, length;
- •If (wsagetasyncerror(lParam))
- •Контрольные вопросы
- •Основы технологии параллельных вычислений
- •Основы разработки и программирования простейших usb-устройств
- •Контрольные вопросы
- •Заключение
- •Программирование электронных устройств
- •445667, Г. Тольятти, ул. Белорусская, 14
Void Stop()
{
if (g_serverSocket == INVALID_SOCKET)
{
strcpy(g_szStatus, «Сервер не запущен или уже остановлен»);
return;
}
closesocket(g_serverSocket);
g_serverSocket = INVALID_SOCKET;
If (wsaCleanup())
{
strcpy(g_szStatus, “Ошибка освобождения Winsock”);
return;
}
strcpy(g_szStatus, “Сервер успешно остановлен”);
return;
}
Итак, нам нужно запустить и остановить сервер. Это будет происходить по нажатию левой кнопки мыши – запуск, правой – остановка. В текст простейшего приложения Windowsвнесены следующие изменения:
добавлено подключение заголовочного файла winsock.h;
определены константы для номера используемой версии winsockи пользовательского сообщения, которое будет генерироваться при поступлении запроса с клиентской программы;
введены функции Start() иStop() для запуска и остановки сервера;
добавлены две глобальных переменных g_szStatus и g_serverSocketдля хранения выводимой на экран текстовой информации о состоянии сервера и сокет, запись и чтение в эти переменных осуществляется как в оконной процедуре, так и вStart() и вStop();
в функцию CreateWindowвнесены косметические изменения – названия программы, стиль окна без изменения размера, произвольное начальное положение, описываемое константойCW_USEDEFAULT, размеры окна, опытным путем подобранные под выводимый текст состояния;
новая оконная процедура теперь обрабатывает сообщения о создании окна, отпускании левой кнопки мыши, отпускании правой кнопки мыши, поступлении запроса клиента, уничтожении окна.
Результат запуска приложения показан на рисунках 2.4.3, 2.4.4.
Рисунок 2.4.3 – Запуск серверной программы
Рисунок 2.4.4 – Запуск сервера по щелчку левой кнопки мыши
При запуске сервера может появиться оповещение файрволла о сетевой активности приложения. Как подключится к серверу? Для этого необходима другая программа, называемая клиентом. Поскольку при связи сокета с портом указан порт 80, используемый для HTTPпротокола, можно воспользоваться любым Интернет – браузером:InternetExplorer,Firefox,Opera,GoogleChromeи т.д. Чтобы узнатьIPадрес сервера в сети можно воспользоваться командойipconfig. Для это необходимо запустить программу «Командная строка» (Пуск-Все программы – Стандартные – Командная строка или Пуск – Выполнить… - набратьcmdи нажатьenter), набратьipconfigи нажатьenter. Появится информация, подобная показанной на рисунке 2.4.5.
Рисунок 2.4.6 – Команда ipconfig
Соответственно, зная IP-адрес компьютера, на котором запущена приведенная программа, с помощью браузера можно к ней подключиться с любого компьютера сети. Другим вариантом является использование уникальногоIP– адреса 127.0.0.1, что соответствует адресу локальной машины. То есть, можно запустить сервер и подключится к нему с этого же компьютера, используя приведенныйIP-адрес илиURLlocalhost, соответствующий такомуIP– адресу. Это очень удобно при отладке сетевых программ на одном компьютере, не используя подключение к локальной или глобальной сети.
Результат подключения клиента показан на рисунке 2.4.5.
Рисунок 2.4.7 – Подключение клиента к серверу
Сервер успешно среагировал на подключение клиента обработкой введенного сообщения WM_SERVER_ACCEPT. Однако для полноценной поддержки взаимодействия «клиент – сервер», необходимо, чтобы сервер «ответил» клиенту. Пока этого не происходит, что видно по состоянию браузера, который подключился к серверу, но «завис» на этапе открытия страницы, ожидая ответа.
Окончательный текст демонстрационной программы-сервера следующий:
// Стандартный включаемый файл Windows
#include <windows.h>
#include <winsock.h>
const int WINSOCK_VERSION = 0x0101;
const int WM_SERVER_ACCEPT = WM_USER + 1;
// Прототип функции обратного вызова для обработки сообщений
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);