Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
233
Добавлен:
01.04.2014
Размер:
242.69 Кб
Скачать

Часть 1 – Программирование

Заданный вариант = 37 – 15 – 15 = 7.

Лабораторная работа №1

Постановка задачи: осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: сервер генерирует прогноз погоды на неделю. Клиент посылает день недели и получает соответствующий прогноз.

Краткое описание алгоритма: программа-клиент при запуске инициализирует библиотеку WinSock, создаёт сокет и подключается к удалённому серверу по протоколу TCP. Затем клиент запрашивает у пользователя номер интересующего дня недели в виде строки. Полученная строка отправляется на сервер, после чего происходит принятие ответа и вывод полученного прогноза пользователю. Далее клиент закрывает сокет и завершает работу.

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

Клиентская часть программы:

#include <iostream> // потоки ввода-вывода

#include <winsock2.h> // работа с сокетами

using namespace std;

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s;

sockaddr_in addr;

char b[200];

int err;

SetConsoleCP(1251); // локализация ввода

SetConsoleOutputCP(1251); // локализация вывода

wVersionRequested = MAKEWORD(2, 2); // максимальный номер версии

err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL

if (err != 0) return; // если ошибка - завершение работы

addr.sin_family = AF_INET; // тип адреса

addr.sin_port = htons(1280); // номер порта

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера

s = socket(AF_INET, SOCK_STREAM, 0); // создание сокета, протокол TCP

connect(s, (sockaddr*) &addr, sizeof(addr)); // соединение с удалённым сокетом

cout << "Введите номер дня недели (1..7)" << endl;

cin.getline(b, sizeof(b), '\n'); // ввод строки

send(s, b, sizeof(b), 0); // отправка строки серверу

if (recv(s, b, sizeof(b), 0) != 0) // получение ответа

cout << b << endl; // вывод результата

closesocket(s); // закрытие сокета

WSACleanup(); // завершение работы с WinSock API

}

Серверная часть программы:

#include <stdlib.h> // стандартные функции

#include <iostream> // потоки ввода-вывода

#include <winsock2.h> // работа с сокетами

using namespace std;

Void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s1, s2;

sockaddr_in addr1, addr2;

int i, t, r, err, size;

char b[200], weat[7][200];

char *dow[7] = {"понедельник", "вторник", "среду", "четверг", "пятницу", "субботу", "воскресенье"};

char *rain[3] = {"ясно", "переменная облачность", "ожидается дождь"};

for (i = 0; i < 7; i++) // генерация прогноза на неделю

{

r = rand() % 3; // осадки

t = rand() % 5 + 5; // тепмература

sprintf(weat[i], "Прогноз погоды на %s: температура воздуха %+i, %s.", dow[i], t, rain[r]);

}

wVersionRequested = MAKEWORD(2, 2); // максимальный номер версии

err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL

if (err != 0) return; // если ошибка - завершение работы

addr1.sin_family = AF_INET; // тип адреса

addr1.sin_port = htons(1280); // номер порта

addr1.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера

s1 = socket(AF_INET, SOCK_STREAM, 0); // создание сокета, протокол TCP

bind(s1, (sockaddr*) &addr1, sizeof(addr1)); // связывание сокета с локальным адресом

listen(s1, 5); // перевод сокета в состояние прослушивания

while (true) // вечный цикл обработки

{

size = sizeof(addr2);

s2 = accept(s1, (sockaddr*)&addr2, &size); // ожидание соединения с клиентом

while ((i = recv(s2, b, sizeof(b), 0)) != 0) // пока не закрыто соединение

{

i = atoi(b); // номер дня недели

if ((i >= 1) && (i <= 7)) // проверка на корректность

strcpy(b, weat[i - 1]); // прогноз на выбранный день

else strcpy(b, "Ошибка! Неверный день недели."); // сообщение о ошибке

send(s2, b, sizeof(b), 0); // отправка ответа клиенту

}

closesocket(s2); // закрытие сокета

}

WSACleanup(); // прекращение работы с WinSock DLL

}

Результаты тестирования:

Лабораторная работа №2

Постановка задачи: осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу слово и получает это же слово разбитым на слоги.

Краткое описание алгоритма: программа-клиент при запуске инициализирует библиотеку WinSock и создаёт сокет на основе протокола UDP. Затем клиент запрашивает у пользователя слово и отправляет его на сервер, после чего происходит принятие ответа и вывод полученного слова, разбитого на слоги, пользователю. Далее клиент закрывает сокет и завершает работу.

Программа-сервер также инициализирует библиотеку WinSock, создаёт сокет и ожидает прихода данных от клиента. После приёма слова производится поиск гласных звуков, разбиение на слоги и отправка полученного результата разбиения клиенту. Далее сервер снова ожидает прихода данных.

Клиентская часть программы:

#include <iostream> // потоки ввода-вывода

#include <winsock2.h> // работа с сокетами

using namespace std;

Соседние файлы в папке КР по КС Вариант №7