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

Void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s;

sockaddr_in addr;

char b[200];

int err, size;

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

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

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

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

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

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

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

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

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

cout << "Введите строку" << endl;

cin.getline(b, sizeof(b), '\n'); // ввод слова

size = sizeof(addr);

sendto(s, b, sizeof(b), 0, (sockaddr*) &addr, size); // отправка слова серверу

if (recvfrom(s, b, sizeof(b), 0, (sockaddr*) &addr, &size) != 0) // получение ответа

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

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

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

}

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

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

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

using namespace std;

bool is_vowel(char ch) // проверка, является ли символ гласным

{

int i, l;

char vowels[] = "AаЕеЁёИиОоУуЫыЭэЮюЯя"; // массив гласных

l = strlen(vowels);

for (i = 0; i < l; i++) // перебор массива

{ if (ch == vowels[i]) break; } // проверка символа

return (i != l);

}

Void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s;

sockaddr_in addr;

int err, size;

char b1[200], b2[200];

int i, k, n, v1, v2, s1, s2;

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

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

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

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

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

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

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

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

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

{

size = sizeof(addr);

recvfrom(s, b1, sizeof(b1), 0, (sockaddr*) &addr, &size); // приём строки

n = strlen(b1); // длина принятой строки

for (v1 = 0; v1 < n; v1++)

{ if (is_vowel(b1[v1])) break; } // ищем первую гласную

if (v1 == n) strcpy(b2, b1); // нет гласных - копируем слово целиком

else // есть гласные - разбиваем на слоги

{

k = s1 = s2 = 0;

while (s1 < n) // пока не достигнут конец слова

{

for (v2 = (v1 + 1); v2 < n; v2++)

{ if (is_vowel(b1[v2])) break; } // ищем следующую гласную

if (v2 == n) s2 = n; // не осталось гласных - последний слог

else

{

if ((v2 - v1) > 2) s2 = v1 + 1; // 2 согласных, закрытый слог

else s2 = v1; // открытый слог

}

for (i = s1; i <= s2; i++) b2[k++] = b1[i]; // копируем текущий слог

if (s2 != n) b2[k++] = '-'; // если не конец слова - добавляем дефис

s1 = s2 + 1; v1 = v2; // переход к следующему слогу

}

}

sendto(s, b2, sizeof(b2), 0, (sockaddr*) &addr, size); // отправка ответа

}

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

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

}

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

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

Постановка задачи: осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности клиента реализовать следующим образом: клиент вводит с клавиатуры строку символов и посылает ее серверу. Признак окончания ввода строки – нажатие клавиши "Ввод". Функциональные возможности сервера реализовать следующим образом: сервер, получив эту строку, должен определить длину введенной строки, и, если длина больше 15, то из нее удаляются все цифры. Клиент получает преобразованную строку и количество удаленных цифр.

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

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

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

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

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

using namespace std;

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