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

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 << "Введите строку" << 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 <iostream> // потоки ввода-вывода

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

using namespace std;

DWORD WINAPI thread_func(LPVOID ps) // рабочая функция потока

{

int i, j, l;

char ch, b[200], r[100];

SOCKET s = *((SOCKET *) ps); // дескриптор сокета

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

{

l = strlen(b); // длина полученной строки

if (l > 15) // если больше 15 символов - удаляем цифры

{

for (i = j = 0; i < l; i++) // перебор всех символов в строке

{

ch = b[i]; // текущий символ

if ((ch < '0') || (ch > '9')) b[j++] = ch; // если не цифра - оставляем в строке

}

sprintf(r, "\nУдалено цифр: %i", (l - j));

b[j] = '\0'; strcat(b, r); // количество удалённых цифр

}

else strcpy(b, "Недостаточная длина строки");

send(s, b, sizeof(b), 0); // отправка результата

}

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

return 0;

}

int cl_num = 0; // количество подключённых клиентов

Void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s1, s2;

sockaddr_in addr1, addr2;

int err, size;

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

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); // перевод сокета в состояние прослушивания

cout << "Сервер готов к приёму клиентов." << endl;

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

{

size = sizeof(addr2);

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

cout << "Присоединился клиент #" << ++cl_num << endl;

CreateThread(NULL, NULL, thread_func, &s2, NULL, 0); // запуск нового потока

}

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

}

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

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

Постановка задачи: осуществить взаимодействие клиента и сервера без установления логического соединения (UDP). Реализовать параллельное соединение с использованием многопоточности. Вводится строка. Вывести все ее слова в обратном порядке.

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

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

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

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

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

using namespace std;

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