русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

If (WSACleanup())


Дата добавления: 2015-01-16; просмотров: 684; Нарушение авторских прав


{

strcpy(g_szStatus, “Ошибка освобождения Winsock”);

return;

}

strcpy(g_szStatus, “Сервер успешно остановлен”);

return;

}

Итак, нам нужно запустить и остановить сервер. Это будет происходить по нажатию левой кнопки мыши – запуск, правой – остановка. В текст простейшего приложения Windows внесены следующие изменения:

1. добавлено подключение заголовочного файла winsock.h;

2. определены константы для номера используемой версии winsock и пользовательского сообщения, которое будет генерироваться при поступлении запроса с клиентской программы;

3. введены функции Start() и Stop() для запуска и остановки сервера;

4. добавлены две глобальных переменных g_szStatus и g_serverSocket для хранения выводимой на экран текстовой информации о состоянии сервера и сокет, запись и чтение в эти переменных осуществляется как в оконной процедуре, так и в Start() и в Stop();

5. в функцию CreateWindow внесены косметические изменения – названия программы, стиль окна без изменения размера, произвольное начальное положение, описываемое константой CW_USEDEFAULT, размеры окна, опытным путем подобранные под выводимый текст состояния;

6. новая оконная процедура теперь обрабатывает сообщения о создании окна, отпускании левой кнопки мыши, отпускании правой кнопки мыши, поступлении запроса клиента, уничтожении окна.

Результат запуска приложения показан на рисунках 2.4.3, 2.4.4.

Рисунок 2.4.3 – Запуск серверной программы

Рисунок 2.4.4 – Запуск сервера по щелчку левой кнопки мыши

При запуске сервера может появиться оповещение файрволла о сетевой активности приложения. Как подключится к серверу? Для этого необходима другая программа, называемая клиентом. Поскольку при связи сокета с портом указан порт 80, используемый для HTTP протокола, можно воспользоваться любым Интернет – браузером: Internet Explorer, Firefox, Opera, Google Chrome и т.д. Чтобы узнать IP адрес сервера в сети можно воспользоваться командой ipconfig. Для это необходимо запустить программу «Командная строка» (Пуск-Все программы – Стандартные – Командная строка или Пуск – Выполнить… - набрать cmd и нажать enter), набрать ipconfig и нажать enter. Появится информация, подобная показанной на рисунке 2.4.5.



Рисунок 2.4.6 – Команда ipconfig

Соответственно, зная IP-адрес компьютера, на котором запущена приведенная программа, с помощью браузера можно к ней подключиться с любого компьютера сети. Другим вариантом является использование уникального IP – адреса 127.0.0.1, что соответствует адресу локальной машины. То есть, можно запустить сервер и подключится к нему с этого же компьютера, используя приведенный IP-адрес или URL localhost, соответствующий такому 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);

 

void OnServerAccept(WPARAM, LPARAM);

bool Start(HWND);

void Stop();

 

char g_szStatus[512];

SOCKET g_serverSocket;

 

// Функция вызывается автоматически, когда программа запускается

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{

HWND hWnd;

MSG msg;

WNDCLASSEX wndclass;

 

// Настройка класса окна

wndclass.cbSize = sizeof(WNDCLASSEX);

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = WndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = NULL;

wndclass.lpszClassName = “Window Class”; // Имя класса

wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

 

// Регистрация класса окна

if(RegisterClassEx(&wndclass) == 0)

{

// Сбой программы, выход

return 0;

}

 

// Создание окна

hWnd = CreateWindowEx(

WS_EX_OVERLAPPEDWINDOW,

«Window Class», // Имя класса

«Сервер», // Текст заголовка

WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,

CW_USEDEFAULT,

CW_USEDEFAULT,

600,

100,

NULL,

NULL,

hInstance,

NULL);

 

// Отображение окна

ShowWindow(hWnd, iCmdShow);

 

// Обработка сообщений, пока программа не будет прервана

while(GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

 

return (int)msg.wParam;

}

 

// Функция обратного вызова для обработки сообщений

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

HDC hDC;

PAINTSTRUCT ps;

 

switch(iMsg)

{

// Вызывается сразу же при создании окна функцией CreateWindow() (или CreateWindowEx())

case WM_CREATE:

strcpy(g_szStatus, «Щелкните левой кнопкой мыши для запуска сервера, правой для его остановки»);

// g_serverSocket инициализируется значением недействительного сокета

g_serverSocket = INVALID_SOCKET;

break;

// Вызывается, когда пользователь отпускает левую кнопку мыши

case WM_LBUTTONUP:

// Запуск сервера

Start(hWnd);

// Перерисовка окна (генерация сообщения WM_PAINT)

InvalidateRect(hWnd, NULL, TRUE);

break;

// Вызывается, когда пользователь отпускает правую кнопку мыши

case WM_RBUTTONUP:

// Остановка сервера

Stop();

InvalidateRect(hWnd, NULL, TRUE);

break;

case WM_SERVER_ACCEPT:

OnServerAccept(wParam, lParam);

InvalidateRect(hWnd, NULL, TRUE);

break;

// Вызывается, когда окно обновляется

case WM_PAINT:

hDC = BeginPaint(hWnd, &ps);

TextOut(hDC, 20, 20, g_szStatus, (int)strlen(g_szStatus));

EndPaint(hWnd, &ps);

break;

// Вызывается, когда пользователь закрывает окно

case WM_DESTROY:

// Остановка сервера при закрытии окна

Stop();

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, iMsg, wParam, lParam);

}

 

return 0;

}

 



<== предыдущая лекция | следующая лекция ==>
Bool Start(HWND hWnd) | If (WSAGETASYNCERROR(lParam))


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.006 сек.