16 вариантЧасть 1 Задание 1 Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает два числа серверу и одну из математических операций: "*", "/", "+", "-" ,- сервер соответственно умножает, делит, складывает либо вычитает эти два числа и ответ посылает ответ назад клиенту. Нам необходимо написать две программы серверную и клиентскую. В серверной программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол TCP, при помощи функции socket. Устанавливаем сокету адрес и порт, используя функцию bind. Далее ожидаем установки соединения с клиентом, для чего используем функцию listen. После прихода с клиента предложения о соединении, принимаем его, используя функцию accept. И начинаем принимать данные с клиента, используя функцию recv. Принятые данные обрабатываем, исходя из условия задачи, и отсылаем результат обработки, используя функцию send. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup. В клиентской программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол TCP, при помощи функции socket. Устанавливаем соединение с сервером, используя функцию connect. Считываем данные с потока входа, при помощи функции std::cin.getline, и отсылаем их на сервер, используя функцию send. Получаем результат с сервера, используя функцию recv, и выводим его на экран, посредством функции std::cout. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup. #include <winsock2.h> #include <iostream> #include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
int main() { setlocale(LC_ALL, "Russian"); WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); WSAStartup(wVersionRequested, &wsaData); struct sockaddr_in peer; peer.sin_family = AF_INET; peer.sin_port = htons(1280); // т.к. клиент и сервер на одном компьютере, // пишем адрес 127.0.0.1 peer.sin_addr.s_addr = inet_addr("127.0.0.1"); SOCKET s = socket(AF_INET, SOCK_STREAM, 0); connect(s, (struct sockaddr*) &peer, sizeof(peer)); char buf[255], b[255]; std::cout << "Введите два числа и математическую операцию (+, -, *, или /) между ними.\n Например: 2+2" << std::endl; std::cin.getline(buf, 100, '\n'); send(s, buf, sizeof(buf), 0); if (recv(s, b, sizeof(b), 0) != 0) { b[strlen(b)] = '\0'; //Удаление ненужных символов // в конце строки std::cout << b << std::endl; std::cin.get(); } closesocket(s); WSACleanup(); return 0;
Задание 2 Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу строку, сервер возвращает эту же строку, но гласные в ней должны быть в верхнем регистре. Нам необходимо написать две программы серверную и клиентскую. В серверной программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол UDP, при помощи функции socket. Устанавливаем сокету адрес и порт, используя функцию bind. Далее ожидаем установки соединения с клиентом, для чего используем функцию listen. Принимаем данные с клиента, используя функцию recvfrom. Принятые данные обрабатываем, исходя из условия задачи, и отсылаем результат обработки, используя функцию sendto. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup. В клиентской программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол UDP, при помощи функции socket. Устанавливаем соединение с сервером, используя функцию connect. Считываем данные с потока входа, при помощи функции std::cin.getline, и отсылаем их на сервер, используя функцию sendto. Получаем результат с сервера, используя функцию recvfrom, и выводим его на экран, посредством функции std::cout. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup. #include <winsock2.h> #include <iostream> #include <stdio.h> #include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
int main() { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); WSAStartup(wVersionRequested, &wsaData);
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in local; local.sin_family = AF_INET; local.sin_port = htons(1280); local.sin_addr.s_addr = htonl(INADDR_ANY); int size = sizeof(local); int c = bind(s, (struct sockaddr*)&local, size);
int r = listen(s, 5);
char *vowels = "eioau"; int difference = 'A' - 'a'; while (true) { char res[255], b[255]; while (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&local, &size) != 0) { for (int i = 0; i < strlen(b); i++) { if (strchr(vowels, *(b + i)) != 0) { *(b + i) += difference; } } // Посылает данные на соединенный сокет sendto(s, b, sizeof(b), 0, (struct sockaddr*)&local, size); }
int main() { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); WSAStartup(wVersionRequested, &wsaData); struct sockaddr_in peer; peer.sin_family = AF_INET; peer.sin_port = htons(1280); // т.к. клиент и сервер на одном компьютере, // пишем адрес 127.0.0.1 peer.sin_addr.s_addr = inet_addr("127.0.0.1"); SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); int size = sizeof(peer); char buf[255], b[255]; std::cout << "Enter string." << std::endl; std::cin.getline(buf, 100, '\n'); sendto(s, buf, sizeof(buf), 0, (sockaddr *)&peer, size); if (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&peer, &size) != 0) { b[strlen(b)] = '\0'; //Удаление ненужных символов // в конце строки std::cout << b << std::endl; std::cin.get(); } closesocket(s); WSACleanup(); return 0;
}
Задание 3 Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности клиента реализовать следующим образом: клиент вводит с клавиатуры строку символов и посылает ее серверу. Признак окончания ввода строки - нажатие клавиши "Ввод". Функциональные возможности сервера реализовать следующим образом: сервер, получив эту строку, должен определить длину введенной строки, и, если эта длина кратна 3, то удаляются все числа, которые делятся на 3. Результаты преобразований этой строки возвращаются назад клиенту. Нам необходимо написать две программы серверную и клиентскую. Алгоритм серверной программы совпадает с алгоритмом, описанным в задаче 1. За исключением приема данных с клиента их обработки и отправки назад. Вышеописанная работа произведена в отдельной функции с именем ThreadFunc. Она вызывается в отдельном потоке после установки соединения с клиентом, используя функцию CreateThread. Алгоритм клиентской программы совпадает с алгоритмом, описанным в задаче 1. #include<stdio.h> #include<iostream> #include<winsock2.h> #pragma comment(lib,"Ws2_32.lib")
DWORD WINAPI ThreadFunc(LPVOID client_socket) { SOCKET *s2 = ((SOCKET *)client_socket); char buf[100]; char buf1[100]; char *testStr = "0369"; // send(s2,"Welcome new client!\n",sizeof("Welcome new client!\n"),0); while (recv(*s2, buf, sizeof(buf), 0) != 0) { int k, j = 0; k = strlen(buf); if (k % 3 == 0) { for (int i = 0; i < k; i++) { if (strchr(testStr, buf[i]) == 0) { buf1[j++] = buf[i]; } } buf1[j] = '\0'; strcpy(buf, buf1); } std::cout << buf << std::endl; send(*s2, buf, strlen(buf)+1, 0); } closesocket(*s2); return 0; }
int main() { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); WSAStartup(wVersionRequested, &wsaData); struct sockaddr_in peer; peer.sin_family = AF_INET; peer.sin_port = htons(1280); // т.к. клиент и сервер на одном компьютере, // пишем адрес 127.0.0.1 peer.sin_addr.s_addr = inet_addr("127.0.0.1"); SOCKET s = socket(AF_INET, SOCK_STREAM, 0); connect(s, (struct sockaddr*) &peer, sizeof(peer)); char buf[255], b[255]; while(1){ std::cout << "Enter string." << std::endl; std::cin >> buf; std::cin.get(); send(s, buf, strlen(buf) + 1, 0); if (recv(s, b, sizeof(b), 0) != 0) { std::cout << b << std::endl; std::cin.get(); } } shutdown(s, SD_SEND); WSACleanup(); return 0;
}
Задание 4 Осуществить взаимодействие клиента и сервера без установления логического соединения (UDP). Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности: водится текст и некоторое слово. Вывести только те предложения из текста, которые содержат данное слово. Нам необходимо написать две программы серверную и клиентскую. Алгоритм серверной программы совпадает с алгоритмом, описанным в задаче 2. За исключением приема данных с клиента их обработки и отправки назад. Вышеописанная работа произведена в отдельной функции с именем StringAnalizing. Она вызывается в отдельном потоке после создания сокета, используя функцию _beginthread. Алгоритм клиентской программы совпадает с алгоритмом, описанным в задаче 2. #include <winsock2.h> #include <process.h> #include <iostream>
Задание 5 (Лабораторная работа №8, вариант 1) Реализовать простейший почтовый сервер и протокол взаимодействия с ним. Предусмотреть команды авторизации пользователя и отправки писем. Нам необходимо написать две программы серверную и клиентскую. Для разработки сервера сначала необходимо решить, какая структура данных будет играть роль Email-центра. Очевидно, это будет файловая структура данных. Для представления файла удобно использовать класс CFile из библиотеки классов MFC. Для этого необходимо подключить модуль "afx.h", а также выбрать опцию Using MFC in a shared DLL (Alt+F7, вкладка General). В серверной программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол TCP, при помощи функции socket. Устанавливаем сокету адрес и порт, используя функцию bind. Далее ожидаем установки соединения с клиентом, для чего используем функцию listen. После прихода с клиента предложения о соединении, принимаем его, используя функцию accept. И начинаем принимать данные с клиента, используя функцию recv. Принятые данные обрабатываем, исходя из условия задачи, и отсылаем результат обработки, используя функцию send. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup. В клиентской программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол TCP, при помощи функции socket. Устанавливаем соединение с сервером, используя функцию connect. Считываем данные с потока входа, при помощи функции std::cin.getline, и отсылаем их на сервер, используя функцию send. Получаем результат с сервера, используя функцию recv, и выводим его на экран, посредством функции std::cout. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup. // server.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #ifdef _DEBUG #define new DEBUG_NEW #endif