Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.1.2017
Репутация: нет Всего: нет
|
Функциональные возможности клиента реализовать следующим образом: клиент вводит с клавиатуры строку символов и посылает ее серверу. Функциональные возможности сервера реализовать следующим образом: сервер, получив эту строку, должен определить длину введенной строки, и, если эта длина кратна четырем, то первая часть строки меняется местами со второй. Результаты преобразований возвращаются назад клиенту. сервер Код | #include<stdio.h> #include<iostream> #include<winsock2.h>
#pragma comment(lib,"Ws2_32.lib") using namespace std;
DWORD WINAPI ThreadFunc(LPVOID client_socket) {
SOCKET s2 = ((SOCKET *)client_socket)[0]; char buf[100]; char buf1[100]; while (recv(s2, buf, sizeof(buf), 0)) { int k, j = 0; k = strlen(buf);
if (k % 4 == 0) { for (int i = k / 2; i < k; i++) { buf1[j] = buf[i]; j++; }
for (int i = 0; i < k / 2; i++) { buf1[j] = buf[i]; j++; }
buf1[k] = '\0'; strcpy(buf, buf1); } cout << buf << endl; send(s2, buf, strlen(buf) + 1, 0); } closesocket(s2); return 0; } int numcl = 0; void print() { if (numcl) printf("%d client connected\n", numcl); else printf("No clients connected\n"); }
void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return; } SOCKET s = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in local_addr; local_addr.sin_family = AF_INET; local_addr.sin_port = htons(1280); local_addr.sin_addr.s_addr = 0; bind(s, (sockaddr *)&local_addr, sizeof(local_addr)); int c = listen(s, 5); std::cout << "Server receive ready" << std::endl; std::cout << std::endl; // извлекаем сообщение из очереди SOCKET client_socket; // сокет для клиента sockaddr_in client_addr; // адрес клиента(заполняется системой) int client_addr_size = sizeof(client_addr); // цикл извлечения запросов на подключение из очереди while ((client_socket = accept(s, (sockaddr *)&client_addr, &client_addr_size))) { numcl++; print(); // Вызов нового потока для обслуживания клиента CreateThread(NULL, NULL, ThreadFunc, &client_socket, NULL, NULL); } }
|
клиент Код | #include <winsock2.h> #include <iostream> #include <stdlib.h> #pragma comment(lib,"Ws2_32.lib") 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]; 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; }
|
Есть такая клиент-серверная программа. Мне необходимо переделать программу следующим образом. Клиент вводит с клавиатуры числовые значение p и q, числовые значения ключей K_a и K_b. Данные посылаются серверу. Сервер в свою очередь вычисляется открытые ключи для первого пользователя и для второго пользователя и возвращает значения этих ключей назад клиенту. алгоритм диффи-хеллмана выглядит следующим образом и нужно как реализовать в серверной части. Код | #include<iostream> using namespace std; long int power(int a, int b, int mod) { long long int t; if(b == 1) return a; t = power(a, b/2, mod); if(b % 2 == 0) return (t * t) % mod; else return (((t * t) % mod) * a) % mod; } int main() { setlocale(LC_ALL, "rus"); int p, q, K_a, K_b, a, b; cout << "Введите значение p и q: " << endl; cout << "p="; cin >> p; cout << "q="; cin >> q; cout << endl; cout << "Введите значение K_a для первого лица: " << endl; cout << "K_a="; cin >> K_a; a = power(q, K_a, p); cout << "Введите значение K_b для второго лица: " << endl; cout << "K_b="; cin >> K_b; b = power(q, K_b, p); cout << endl; cout << "Ключ для первого лица: " << power(b, K_a, p) << endl; cout << "Ключ для второго лица: " << power(a, K_b, p) << endl; system("pause"); return 0; }
|
|