Информационно-вычислительная сеть на основе архитектуры "клиент-сервер", предметная область: "Магазин бытовой техники"

Тип работы:
Курсовая
Предмет:
Коммуникации, связь, цифровые приборы и радиоэлектроника


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

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

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

Министерство образования и науки Российской Федерации

Пензенский государственный университет

Кафедра вычислительной техники

Специальность 230 101 «Вычислительные машины, комплексы, системы и сети»

Пояснительная записка

к курсовому проекту

по дисциплине «Сети ЭВМ и телекоммуникации»

на тему:

Информационно-вычислительная сеть на основе архитектуры «клиент-сервер», предметная область: «Магазин бытовой техники»

Автор работы: Ларченко Е. В.

Группа: 08ВВ1

Руководитель работы: Зинкин С. А.

Пенза, 2012 г.

Реферат

Пояснительная записка содержит 34 страницы, 11 рисунков, 3 приложения.

Объектом разработки является система программ, осуществляющих взаимодействие посредством сети.

Цель работы: разработка системы программ, осуществляющих взаимодействие посредством сети с использованием среды визуального программирования Microsoft Visual Studio C++ 2010.

Результаты: в результате проведенной работы разработана система программ, реализующая алгоритм сетевого взаимодействия приложений.

сети ЭВМ, клиент, сервер, visual C++, потоки, данные, сокеты, IP- адрес, порт, протокол TCP

Оглавление

  • Введение
  • 1. Архитектура клиент-сервер
    • 1.1 Основные понятия. Сокеты и библиотека WinSock
      • 1.2 Программа «клиент»
      • 1.3 Программа «сервер»
  • 2. Разработка системы передачи данных в локальной вычислительной сети
    • 2.1 Анализ требований
      • 2.2 Проектирование
  • 3. Реализация
    • 3.1 Реализация приложения «сервер»
      • 3.2 Реализация приложения «клиент»
  • 4. База данных «Магазин бытовой техники»
  • 5. Результаты работы
  • Заключение
  • Список использованной литературы
  • Приложение А
  • Приложение Б
  • Приложение В

Введение

Компьютерная сеть обозначает наборы связанных между собой автономных компьютеров. Два компьютера называются связанными между собой, если они могут обмениваться информацией. Связь не обязательно должна осуществляться при помощи медного провода. Могут использоваться самые разнообразные средства связи, включая волоконную оптику, радиоволны высокой частоты и спутники связи. Сети могут отличаться друг от друга также размерами и принципами построения. Как ни странно, ни Интернет, ни так называемая Мировая паутина (WWW) не являются сетями. В литературе существует путаница между понятиями «компьютерная сеть» и «распределенная система». Основное их различие заключается в том, что в распределенной системе наличие многочисленных автономных компьютеров незаметно для пользователя. С его точки зрения, это единая связанная система. Пользователи имеют дело с реальными машинами, и со стороны вычислительной системы не осуществляется никаких попыток связать их воедино. Тем не менее, эти два понятия имеют много общего. Например, как компьютерная сеть, так и распределенная система занимаются перемещением файлов. Разница заключается в том, кто вызывает эти перемещения — система или пользователь.

В настоящее время для связи компьютеров в сетях очень часто используется протокол TCP. Протокол TCP предполагает, что нижестоящим протоколом является Internet (IP).

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

1. Архитектура клиент-сервер

1.1 Основные понятия. Сокеты и библиотека WinSock

Как правило, компьютеры и программы, входящие в состав информационной системы, не являются равноправными. Некоторые из них владеют ресурсами (файловая система, процессор, принтер, база данных и т. д.), другие имеют возможность обращаться к этим ресурсам. Компьютер (или программу), управляющий ресурсом, называют сервером этого ресурса (файл-сервер, сервер базы данных, вычислительный сервер…). Клиент и сервер какого-либо ресурса могут находится как в рамках одной вычислительной системы, так и на различных компьютерах, связанных сетью.

Основной принцип технологии «клиент-сервер» заключается в разделении функций приложения на три группы:

— ввод и отображение данных (взаимодействие с пользователем);

— прикладные функции, характерные для данной предметной области;

— функции управления ресурсами (файловой системой, базой данных и т. д.)

Поэтому, в любом приложении выделяются следующие компоненты:

— компонент представления данных

— прикладной компонент

— компонент управления ресурсом

Связь между компонентами осуществляется по определенным правилам, которые называют «протокол взаимодействия».

Сомкеты (англ. socket — углубление, гнездо, разъём) -- название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет -- абстрактный объект, представляющий конечную точку соединения.

Следует различать клиентские и серверные сокеты. Клиентские сокеты грубо можно сравнить с оконечными аппаратами телефонной сети, а серверные -- с коммутаторами. Клиентское приложение (например, браузер) использует только клиентские сокеты, а серверное (например, веб-сервер, которому браузер посылает запросы) -- как клиентские, так и серверные сокеты. Сокеты позволяют независимо от протокола передачи данных организовать сетевой интерфейс между двумя компьютерами в сети. В частности, сокеты могут работать как с протоколом TCP, так и с протоколом UDP. Обращаться к сокету можно по IP-адресу хост-машины и номеру порта. Сокеты нашли широкое применение во многих сетевых приложениях. Большинство современных операционных систем (такие как Windows, Unix, Linux) поддерживает сокеты на уровне встроенных в ядро библиотек. Различают сокеты с установлением соединения (т. Е. адреса гнезд отправителя и получателя выясняются заранее, до передачи сообщений между ними — устанавливается так называемый виртуальный канал между двумя хостами в сети) и без установления соединения (адреса сокетов отправителя и получателя передаются с каждым пересылаемым сообщением). Для каждого сокета назначается тип, посредством которого определяется способ передачи данных между двумя сокетами. Тип сокета с установлением соединения — это виртуальный канал, а тип сокета без установления соединения — дейтаграмма. В первом случае для передачи данных используется протокол TCP, во втором — UDP. Следовательно, надежность передачи данных в случае дейтаграммных сокетов ниже, зато они работают быстрее виртуальных каналов. Сокеты с установлением соединения взаимодействуют по схеме клиент/сервер: серверному сокету назначается общеизвестный адрес, и оно непрерывно ожидает прибытия клиентских сообщений. Клиентский процесс посылает сообщения на сервер по объявленному адресу серверного сокета.

Все функции работы с сокетами описаны в заголовочном файле winsock2.h. Для успешной сборки программы в опциях компоновщика необходимо указать подключаемую библиотеку ws232. lib. Для начала работы с сетью необходимо проинициализировать библиотеку ws232. Для этого используется следующая функция: int WSAStartup (unsigned int wVersionRequested, struct WSAData *lpWSAData). Эта функция должна вызываться в самом начале программы, работающей с сокетами. Аргумент wVersionRequested должен содержать значение максимального номера версии библиотеки гнезд, требуемой для корректной работы программы. Функция анализирует переданное ей значение и, если оно меньше либо равно версии библиотеки Ws232. dll, то возвращает 0, что соответствует успешной инициализации. В противном случае функция возвращает ненулевое значение, означающее, что данная версия не поддерживается в текущей реализации библиотеки сокетов. Аргумент wVersionRequested формируется из двух байт при помощи макроса MAKEWORD (x, y). Для успешного выполнения функции WSAStartup необходимо в этом аргументе передать указатель на существующую структуру типа WSAData.

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

При завершении работы с сокетами необходимо вызвать функцию int WSACleanup (), которая завершает работу программы с библиотекой гнезд Ws232. При успешном выполнении функция возвращает 0. Если произошла ошибка, возвращается ненулевое значение.

1.2 Программа «клиент»

Для того, чтобы клиент смог подключится к серверу, ему необходимо создать сокет. Для этого программа клиент вызывает специальную функцию Socket которая позволяет выбрать нужный нам формат адреса, тип гнезда, а также задать протокол с помощью которого будет осуществляться обмен с сервером.

int socket (int dom, int type, int protocol)

— dom — формат адреса;

— type — тип гнезда;

— protocol — задает код конкретного протокола;

Перед тем как осуществить отправку, данные шифруются. После, используется функция Sendto для отправки данных по заданному нами адресу.

Передача данных происходит тогда, когда сервер ожидает приёма соединения.

Для разрыва соединения используется функция Close, которая уничтожает созданный ранее сокет.

1.3 Программа «сервер»

Основной задачей серверной части является обработка. Обмен данными с клиентскими процессами есть важная составляющая часть этой задачи.

Программа «сервер» также как и «клиент» создаёт сокет, но в отличае от клиента, сервер должен создавать для каждого клиента отдельный сокет.

Далее осуществляется получение локального адреса, чтобы все запросы на соединения, приходящие Сервер и обращающиеся к указанному порту, операционная система направляла данному процессу. Осуществляется вызов функции bind.

int bind (int sid, struct sockaddr* addr_p, int len)

— sid — дескриптор гнезда;

— struct sockaddr*_p — адрес сетевого интерфейса;

— len — размер структуры на который указывает второй параметр;

После того как сервер выделил для клиента локальный адрес, вызывается функция listen, которая говорит операционной системе о том, что процесс ожидает поступления запросов на соединение к данному сокету.

Далее клиент подключается к серверу, осуществляется обмен информацией. Сервер связан с БД, откуда и берётся необходимая информация. Используется СУБД MS Access. После приема данных они дешифруются.

Когда обмен данными завершается сервер удаляет копию сокета.

2. Разработка системы передачи данных в локальной вычислительной сети

2.1 Анализ требований

Необходимо разработать систему программ, осуществляющих взаимодействие посредствам локальной вычислительной сети, т. е. нужно реализовать два приложения: «сервер» и «клиент». Программа «сервер» должна поддерживать множество соединений с программой «клиент». Программа «клиент» посылает запрос на обмен данными с сервером, после подтверждения сервером данного запроса осуществляется обмен информацией, далее происходит разрыв соединения. Сетевой интерфейс между компьютерами в сети необходимо организовать с помощью сокетов. Программа «сервер» должна быть готова к отправке сообщения всем подключенным в данный момент клиентам. Реализация приложения — в среде программирования Microsoft Visual Studio. Программа должна обладать графическим интерфейсом, разработанным на базе библиотеки MFC.

2.2 Проектирование

Исходя из требований к разрабатываемой системе, необходимо реализовать два приложения: приложение «клиент» и приложение «сервер».

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

Клиент делает запрос на сервер и принимает информацию.

3. Реализация

3.1 Реализация приложения «сервер»

При запуске программы «сервер» производится инициализация библиотеки WinSock. Запускается поток прослушивания порта 25 0188(стоит по умолчанию). При подключении клиента, запускается новый поток, в котором происходит обработка строки и отправка ее, клиенту. Вводится пароль. Выбирается источник данных — БД MS Access. Через функцию GetODBCFieldCount () осуществляется работа с ODBC, происходит выбор нужной базы данных и подключение. Сервер ожидает обращения клиентов. Удаление клиента заключается в удалении клиента из массива клиентов и из списка клиентов.

3.2 Реализация приложения «клиент»

При запуске приложения клиента производится инициализации библиотеки WinSock. (в случае неудачи получаем код ошибки с помощью функции WSAGetLastError).

При нажатии кнопки Connect производится попытка подключиться к сокету сервера с указанным IP адресом и портом. Если сервер не готов к работе, то выводится сообщение об ошибке соединения. При удачном соединении запускается поток, в котором серверу отправляется имя клиента и начинается прослушивание сокета. Клиент делает запрос. Сервер отсылает информацию клиенту. Полученные данные выводятся на экран.

4. База данных «Магазин бытовой техники»

Рассмотрим предметную область, связанную с магазином бытовой техники. В магазине есть несколько групп товаров, склад, состав расходов и общий учёт расходов и доходов компании. Разработана база данных, определяющая описанную выше предметную область. Основными конструктивными элементами инфологических моделей являются сущности, связи между ними и их свойства (атрибуты). В построенной модели имеются пять сущностей.

1. Группы товаров (ID, название группы)

Эта сущность отводится для хранения информации обо всех видах товара. Атрибут «ID» выполняет функцию индексной связи между сущностями, которая определяет связь между таблицами Группы товаров — Товары — Состав расхода — Склад.

2. Товары (ID, Группа, Название, Количество, Цена закупки, Цена продажи)

Эта сущность хранит информацию о количестве товаров, их разновидности и о цене закупки и продажи. Атрибут «ID» связывает таблицы Товары — Состав расхода — Склад.

3. Состав расхода (Шифр расхода, ID-товара, Количество, Цена реализации)

Эта сущность хранит информацию о расходах, затраченных на закупку товара. Атрибут «Шифр расхода» связывает таблицы Состав расхода — Приход/Расход.

4. Склад (Шифр прихода, ID товара, Цена закупки, Кол-во закупок, Кол-во реализации)

Эта сущность хранит информацию о количестве оставшегося товара и о цене покупки данного товара. Атрибут «Шифр прихода» выполняет функцию индексной связи между сущностями, которая определяет связь между таблицами Склад — Приход/Расход.

5. Приход/Расход (Шифр, Тип операции, Дата)

Эта сущность хранит информацию о всех операциях связанных с реализацией товара. Атрибут «Шифр» имеет характер индексной связи между сущностями, которая определяет связь между таблицами Приход/Расход — Склад — Состав расхода.

Модель данной БД представлена на рисунке 1.

Рисунок 1 — Модель базы данных

5. Результаты работы

Было проведено тестирование программы, подтверждающее правильность её работы. Ниже приведены результаты работы.

Рисунок 2 — Приложение «клиент»

Рисунок 3 — Приложение «сервер»

Рисунок 4 — Выбор источника данных

Рисунок 5 — Запуск сервера прошел успешно

Рисунок 6 — Получение данных после запроса от клиента

Заключение

В ходе выполнения курсового проекта было разработано «клиент-серверное приложение» для передачи и обработки данных. Программа была разработана на языке С++ в среде программирования Microsoft Visual Studio.

Проведённое тестирование показало правильность работы программ. Разработка проведена с использованием операционной системы Windows 7 на ПК с процессором Phenom II.

Список использованной литературы

1. Зинкин С. А. Курс лекций по курсу «Сети ЭВМ и телекоммуникации»

2. Компьютерные сети. Принципы, технологии, протоколы / В. Г. Олифер, Н. А. Олифер. -СПб.: Питер, 2002.

3. Филиппов М. В. Вычислительные машины, компьютерные сети и системы телекоммуникации.

4. MSDN Library. Copyright 1995−2000 Microsoft Corporation.

5. Сети ЭВМ: протоколы, стандарты, интерфейсы / Ю. Блэк; перев. с англ. — М.: Мир, 1990.

6. А. П. Сергеев Офисные и локальные сети. Самоучитель: — М.: Издательский дом «Вильямс», 2003

7. www. ru. wikipedia. org

магазин сеть клиент сервер

Приложение, А (обязательное)

Листинг программного текста

Приложение «Сервер»

#include «stdafx. h»

#include «lip_server. h»

#include «MainFrm. h»

#include «lip_serverDoc. h»

#include «lip_serverView. h»

#include «ParamDlg. h»

#include «global. h»

#include «. crypt. h»

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

BEGIN_MESSAGE_MAP (CLip_serverApp, CWinApp)

//{{AFX_MSG_MAP (CLip_serverApp)

ON_COMMAND (ID_APP_ABOUT, OnAppAbout)

// NOTE — the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard file based document commands

ON_COMMAND (ID_FILE_NEW, CWinApp: :OnFileNew)

ON_COMMAND (ID_FILE_OPEN, CWinApp: :OnFileOpen)

END_MESSAGE_MAP ()

CLip_serverApp: :CLip_serverApp ()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

CLip_serverApp theApp;

BOOL CLip_serverApp: :InitInstance ()

{

if (!AfxSocketInit ())

{

AfxMessageBox (IDP_SOCKETS_INIT_FAILED);

return FALSE;

}

ParamDlg d (NULL);

if (d. DoModal () == IDOK) {

port = d. m_Port;

password = d. m_Password;

pLipDB = new CDatabase ();

pLipDB-> OpenEx (NULL, 0);

pLipRec = new CRecordset (pLipDB);

IsBusy = false;

AfxBeginThread (WaitingForConnect, NULL);

}

else

return false;

#ifdef _AFXDLL

Enable3dControls (); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic (); // Call this when linking to MFC statically

#endif

SetRegistryKey (_T («Local AppWizard-Generated Applications»));

LoadStdProfileSettings (0); // Load standard INI file options (including RU)

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate (

IDR_MAINFRAME,

RUNTIME_CLASS (CLip_serverDoc),

RUNTIME_CLASS (CMainFrame), // main SDI frame window

RUNTIME_CLASS (CLip_serverView));

AddDocTemplate (pDocTemplate);

// Parse command line for standard shell commands, DDE, file open

CCommandLineInfo cmdInfo;

ParseCommandLine (cmdInfo);

// Dispatch commands specified on the command line

if (!ProcessShellCommand (cmdInfo))

return FALSE;

// The one and only window has been initialized, so show and update it.

m_pMainWnd-> ShowWindow (SW_SHOW);

m_pMainWnd-> UpdateWindow ();

return TRUE;

}

int CLip_serverApp: :ExitInstance ()

{

if (pLipRec) {

pLipRec-> Close ();

delete pLipRec;

}

if (pLipDB) {

pLipDB-> Close ();

delete pLipDB;

}

return CWinApp: :ExitInstance ();

}

class CAboutDlg: public CDialog

{

public:

CAboutDlg ();

// Dialog Data

//{{AFX_DATA (CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL (CAboutDlg)

protected:

virtual void DoDataExchange (CDataExchange* pDX); // DDX/DDV upport

//}}AFX_VIRTUAL

// Implementation

protected:

DECLARE_MESSAGE_MAP ()

};

CAboutDlg: :CAboutDlg (): CDialog (CAboutDlg: :IDD)

{

}

void CAboutDlg: :DoDataExchange (CDataExchange* pDX)

{

CDialog: :DoDataExchange (pDX);

}

BEGIN_MESSAGE_MAP (CAboutDlg, CDialog)

END_MESSAGE_MAP ()

// App command to run the dialog

void CLip_serverApp: :OnAppAbout ()

{

CAboutDlg aboutDlg;

aboutDlg. DoModal ();

}

UINT WaitingForConnect (LPVOID pParam)

{

SOCKET MySocket; // основное гнездо — на которое принимаются соединения

sockaddr_inMySocketAdress; // структура данных гнезда

SOCKET newSocket; // гнездо, на которое перенаправляются соединения

inta;

MySocket = socket (AF_INET, SOCK_STREAM, 0); // создать гнездо

if (MySocket == INVALID_SOCKET)

{ // в случае неудачи — выдать сообщение и выйти

// cout< <endl<<"socket (…) error «< <WSAGetLastError ()<<endl;

return 0;

}

MySocketAdress. sin_family = AF_INET; // заполнение структуры

данных

MySocketAdress. sin_port = htons (port);

MySocketAdress. sin_addr. s_addr = htonl (INADDR_ANY);

if (bind (MySocket, (sockaddr*) & MySocketAdress,

sizeof (MySocketAdress)) == SOCKET_ERROR) // получение локального

адреса

{ // в случае неудачи — выдать сообщение, закрыть гнездо и выйти

// cout< <endl<<"bind (…) error «< <WSAGetLastError ()<<endl;

closesocket (MySocket);

return 0;

}

if (listen (MySocket, 5) == SOCKET_ERROR) // перевести гнездо в с

остояние ожидания

{

// cout< <endl<<"listen (…) error «< <WSAGetLastError ()<<endl;

closesocket (MySocket);

return 0;

}

while (1) {

a = sizeof (sockaddr_in);

newSocket = accept (MySocket, (sockaddr*)& MySocketAdress, & a); //

принять соединение

if (newSocket == INVALID_SOCKET)

{

//cout< <endl<<"accept (…) error «< <WSAGetLastError ()<<endl;

closesocket (MySocket);

return 0;

}

/*

a = sizeof (sockaddr_in);

if (getpeername (sw, (sockaddr*)& MySocketAdress, & a) ≠

SOCKET_ERROR)

// попытаться получить адрес клиента

cout< <"accepted connection from «< <inet_ntoa (sa. sin_addr)<<endl;

*/

// запустить в отдельной нити функцию обслуживания клиента

if (!AfxBeginThread (ConnectHandler, (void*) newSocket))

{

//cout< <endl<<"_beginthread (…) error «< <errno<<endl;

closesocket (MySocket);

return 0;

}

}

closesocket (MySocket);

return 0;

}

UINT ConnectHandler (LPVOID pParam)

{

SOCKET s = (SOCKET) pParam; // гнездо, с которым будет вестись

обмен

char buf[500], // буферы для данных

encrypted[500], // буфер для шифрованного текста

pwd[21]; // пароль

char len[4];

CString str;

int n, nFields;

strncpy (pwd, password. operator LPCTSTR (), 20);

recv (s, len, sizeof len, 0); // прием данных от клиента

n = recv (s, encrypted, (int) len, 0); // прием данных от клиента

crypt (encrypted, buf, pwd, n);

if (n < 1) {

closesocket (s); // закрытие гнезда

return 0;

}

do {

while (IsBusy);

IsBusy = true;

CODBCFieldInfo LipField;

n = pLipRec-> Open (AFX_DB_USE_DEFAULT_TYPE, buf);

nFields = pLipRec-> GetODBCFieldCount ();

if (n ≠ 0 || nFields > 0) {

send (s, (char*)& nFields, sizeof nFields, 0);

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

pLipRec-> GetODBCFieldInfo (i, LipField);

n = crypt (LipField. m_strName. operator LPCTSTR (),

encrypted, pwd, LipField. m_strName. GetLength () + 1);

send (s, (char*)& n, sizeof n, 0);

send (s, encrypted, n, 0);

}

pLipRec-> MoveFirst ();

while (!pLipRec-> IsEOF ())

{

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

{

pLipRec-> GetFieldValue (i, str);

n = crypt (str, encrypted, pwd, str. GetLength () + 1);

send (s, (char*)& n, sizeof n, 0);

send (s, encrypted, n, 0);

}

pLipRec-> MoveNext ();

if (!pLipRec-> IsEOF ())

len[0] = 1;

else

len[0] = 0;

send (s, len, 1, 0);

}

pLipRec-> Close ();

}

else {

nFields = 0;

send (s, (char*)& nFields, sizeof nFields, 0);

}

IsBusy = false;

recv (s, len, sizeof len, 0); // прием данных от клиента

n = recv (s, encrypted, (int) len, 0); // прием данных от клиента

crypt (encrypted, buf, pwd, n);

} while (n > 0);

closesocket (s); // закрытие гнезда

return 0;

}

#include «stdafx. h»

#include «crypt. h»

#include < string. h>

// функция преобразования строки пароля в гамму шифра

unsigned long gamma (char *pwd)

{

char buf[20];

int i;

unsigned long flag;

static unsigned long g;

if (pwd) {

memset (buf, 0×55, 20); // UUUUUUUUUUUUUUUUUUUU

memcpy (buf, pwd, strlen (pwd)); // passwordUUUUUUUUUUUU

for (i = 0, g = 0; i < 20; i++)// свертка пароля

g += (unsigned long) (buf[i] < < (i % 23));

}

for (i = 5; i > 0; i--) // циклический сдвиг на 5 разрядов вправо

flag = g & 1;

g = g > > 1;

if (flag)

g

return g; // возвратить значение гаммы

}

// шифрует открытый текст source по паролю pwd

// и записывает шифрованный текст в dest

// шифрование симметричное

int crypt (const char *source, char *dest, char *pwd, int len)

{

inti, nBlocs;

unsigned long *pSrc, *pDst, g;

pSrc = (unsigned long *) source;

pDst = (unsigned long *) dest;

g = gamma (pwd); // получить гамму шифра

nBlocs = (len + 1) / 4 + 1; // сосчитать число 32-разрядных блоков

for (i = 0; i < nBlocs; i++, pDst++, pSrc++) // цикл гаммирования

открытого

*pDst = *pSrc ^ gamma (0); // текста блоками по 32 бита

dest[nBlocs * 4] = 0; // вставить завершающий символ 0

return nBlocs * 4 + 1; // возвратить число байт в зашифрованном тексте

}

Приложение «Клиент»

#include «stdafx. h»

#include «llip_client. h»

#include «MainFrm. h»

#include «llip_clientDoc. h»

#include «llip_clientView. h»

#include «PropDlg. h»

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

BEGIN_MESSAGE_MAP (CLlip_clientApp, CWinApp)

//{{AFX_MSG_MAP (CLlip_clientApp)

ON_COMMAND (ID_APP_ABOUT, OnAppAbout)

// NOTE — the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard file based document commands

ON_COMMAND (ID_FILE_NEW, CWinApp: :OnFileNew)

ON_COMMAND (ID_FILE_OPEN, CWinApp: :OnFileOpen)

END_MESSAGE_MAP ()

CLlip_clientApp: :CLlip_clientApp ()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

CLlip_clientApp theApp;

BOOL CLlip_clientApp: :InitInstance ()

{

unsigned short port; // порт сервера

unsigned long addr; // адрес сервера

PropDlg d (NULL);

if (d. DoModal () == IDOK) {

port = d. m_port;

strncpy (m_pwd, d. m_pwd. operator LPCTSTR (), 20);

addr = *((unsigned long*) d. m_addr);

}

else

return false;

if (!AfxSocketInit ())

{

AfxMessageBox (IDP_SOCKETS_INIT_FAILED);

return FALSE;

}

#ifdef _AFXDLL

Enable3dControls (); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic (); // Call this when linking to MFC statically

#endif

SetRegistryKey (_T («Local AppWizard-Generated Applications»));

LoadStdProfileSettings (0); // Load standard INI file options (including

MRU)

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate (

IDR_MAINFRAME,

RUNTIME_CLASS (CLlip_clientDoc),

RUNTIME_CLASS (CMainFrame), // main SDI frame window

RUNTIME_CLASS (CLlip_clientView));

AddDocTemplate (pDocTemplate);

// Parse command line for standard shell commands, DDE, file open

CCommandLineInfo cmdInfo;

ParseCommandLine (cmdInfo);

// Dispatch commands specified on the command line

if (!ProcessShellCommand (cmdInfo))

return FALSE;

// The one and only window has been initialized, so show and update it.

m_pMainWnd-> ShowWindow (SW_SHOW);

m_pMainWnd-> UpdateWindow ();

RECT r;

m_pMainWnd-> GetWindowRect (&r);

r. right = r. left + 500;

r. bottom = r. top + 380;

m_pMainWnd-> MoveWindow (&r);

sockaddr_in sa; // структура данных гнезда

s = socket (AF_INET, SOCK_STREAM, 0); // создать гнездо

if (s == INVALID_SOCKET)

{

MessageBox (NULL, «Socket error. «, «Ошибка», MB_OK);

return 0;

}

if (addr == INADDR_NONE) // при ошибке

{

MessageBox (NULL, «Invalid IP address. «, «Ошибка», MB_OK);

closesocket (s);

return 0;

}

sa. sin_family = AF_INET; // заполнить структуру данных гнезда

sa. sin_port = htons (port);

sa. sin_addr. s_addr = addr;

// установить соединение:

if (connect (s, (sockaddr*)& sa, sizeof (sa)) == SOCKET_ERROR)

{

MessageBox (NULL, «Connect error. «, «Ошибка», MB_OK);

closesocket (s);

return 0;

}

return TRUE;

}

class CAboutDlg: public CDialog

{

public:

CAboutDlg ();

// Dialog Data

//{{AFX_DATA (CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL (CAboutDlg)

protected:

virtual void DoDataExchange (CDataExchange* pDX); // DDX/DDV

support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG (CAboutDlg)

// No message handlers

//}}AFX_MSG

DECLARE_MESSAGE_MAP ()

};

CAboutDlg: :CAboutDlg (): CDialog (CAboutDlg: :IDD)

{

//{{AFX_DATA_INIT (CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg: :DoDataExchange (CDataExchange* pDX)

{

CDialog: :DoDataExchange (pDX);

//{{AFX_DATA_MAP (CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP (CAboutDlg, CDialog)

//{{AFX_MSG_MAP (CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP ()

// App command to run the dialog

void CLlip_clientApp: :OnAppAbout ()

{

CAboutDlg aboutDlg;

aboutDlg. DoModal ();

}

int CLlip_clientApp: :ExitInstance ()

{

closesocket (s); // закрыть гнездо

return CWinApp: :ExitInstance ();}

Приложение Б (обязательное)

UML Диаграммы

Рисунок 7. (приложение Б) — диаграмма вариантов использования

а б

Рисунок 8(приложение Б) — диаграмма деятельности: а — сервер, б — клиент

Рисунок 9 (приложение Б) — диаграмма развертывания

Рисунок 10 (приложение Б) — диаграмма последовательности

Приложение В

Электрическая структурная схема вычислительной сети

Рисунок 11 (Приложение Б) — структурная схема сети

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