Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
igdev
74 / 63 / 14
Регистрация: 22.04.2016
Сообщений: 340
Завершенные тесты: 2
#1

Создание клиент-серверного приложения с применением межпроцессного взаимодействия на основе проекций файлов - C++

08.12.2016, 23:13. Просмотров 275. Ответов 9
Метки нет (Все метки)

Написать с применением межпроцессного взаимодействия на основе проекций файлов два консольных приложения: серверное и клиентское.
Клиентское приложение должно шифровать заданный пользователем файл с применением метода гаммирования на основе пользовательского пароля или выполнять обратное действие и обращаться к серверному приложению, которое осуществляет сжатие полученных данных методом RLE или обратное действие. Полученные после обработки данные сохраняются клиентом в выходном файле, имя которого задает пользователь. Клиент работает следующим образом:
1. сначала пользователь с помощью функции GetOpenFileName и GetSaveFileName выбирает имена входного и выходного файлов, соответственно;
2. затем с помощью функции MessageBox пользователь выбирает режим работы: шифрование + сжатие или распаковка + дешифрование;
3. проверяется доступность сервера, если он не доступен, то выводится сообщение об ошибке и программа завершает свою работу;
4. в зависимости от выбора пользователя для каждой порции данных происходит либо шифрование, а затем отправка ее через проекцию на сервер с целью сжатия, либо наоборот: отправка порции данных на сервер для распаковки, а затем полученные данных расшифровываются;
5. после обработки очередной порции данных она записывается в выходной файл;
6. после окончания процесса преобразования происходит отключение от проекции.

Серверное приложение (поддерживает работу только с одним клиентом) должно:
1. создавать проекцию файла, предназначенную для обмена данными с клиентом;
2. ожидать подключение клиента;
3. в зависимости от служебной информации, переданной клиентом выполнить сжатие или распаковку переданной порции данных но основе метода RLE;
4. отслеживать конец передачи данных клиентом;
5. отключаться от проекции и уничтожать соответствующий обьект;
6. запрашивать у пользователя с помощью функции MessageBox повторное ожидание соединения с клиентом;
7. если пользователь ответит положительно, то переход к пункту 1, в противном случае происходит выход из программы.

У меня есть код, который выполняет все эти действия, но только в рамках одной программы/приложения. Как его можно преобразовать в клиентское и серверное приложения?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <string>
#include <locale>
#include <vector>
#include <iomanip>
#include <sstream>
#include <thread>
 
 
using namespace std;
 
const int FIRST_SYMBOL = ' '; // первый символ
const int SYMBOL_NUMBER = 95; // для простоты кодируем только английский алфавит 
 
ifstream file;
ofstream file_compr;
ifstream f1;
ofstream file_decompr;
string text;
string gamma;
string result;
std::stringstream oss;
TCHAR szFile[1000]; // Адрес файла
double decompressedFile = 0; // Размер расжатого файла
 
 
void GammaCoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ti = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ti + Gi) % SYMBOL_NUMBER);
    }
}
 
void GammaDecoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ci = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ci - Gi + SYMBOL_NUMBER) % SYMBOL_NUMBER);
    }
}
 
// Архивация содержимого файла
void fileArchiving()
{
    char sym; //символ, который мы будем считывать
    int kol = 1;// количество повторяющихся символов
 
    while (oss.get(sym))
    {
        if (kol == 9 || static_cast<unsigned char>(sym) != oss.peek()) // если символ не совпадает со следующим символом в файле
        {
            file_compr << kol << sym; // записываем результаты в выходной файл
            kol = 0;
        }
        kol++;
    }
    file_compr.close();
}
 
// Разархивация и расшифрование данных
void fileDecompression()
{
    char sym1, sym2; // предыдущий и последующий символы
    const char zero = '0';
    while (f1.peek() != EOF)
    {
        f1.get(sym1);
        f1.get(sym2);
        for (int i = 0; i < sym1 - zero; i++)
            oss << sym2;
    }
 
    // Делаем расшифрование
    oss.seekg(0);
    while (getline(oss, result))
    {
        GammaDecoding(result, gamma, text);
        file_decompr << text << endl;
    }
 
    f1.close();
    file_decompr.close();
 
    // Определяем размер расжатого файла
    ifstream file2(szFile);
    file2.seekg(0, std::ios::end);
    decompressedFile = file2.tellg();
    file2.close();
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
 
    
 
    OPENFILENAME ofn;
    
    double initialFile = 0; // Размер начального файла
    double compressedFile = 0; // Размер сжатого файла
   
    
 
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile) / sizeof(TCHAR);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    // Display the Open dialog box. 
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        file.open(szFile);
    }
    
    // Определяем размер начального файла
    file.seekg(0, std::ios::end);
    initialFile = file.tellg();
    file.seekg(0);
    
    
    cout << "Введите гамму: ";
    cin >> gamma;
    
    // Производим шифрование и полученый результат 
    // записываем в поток stringstream
    while (getline(file, text))
    {
        GammaCoding(text, gamma, result);
        oss << result;
    }
    
 
    // Задаем файл для сохранения архивированного 
    // содержимого текста
    if (GetSaveFileName(&ofn))
    {
        file_compr.open(szFile);
    }
 
 
    LARGE_INTEGER timerFrequency, timerStart, timerStop;
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    thread first(fileArchiving);
    first.join();
 
    QueryPerformanceCounter(&timerStop);
    double const t_encode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время архивации
 
    
 
    // Обнуляем поток stringstream
    oss.str("");
    oss.clear();
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        f1.open(szFile);
    }
 
    // Определяем размер сжатого файла
    f1.seekg(0, std::ios::end);
    compressedFile = f1.tellg();
    f1.seekg(0);
 
    // Выбираем файл, куда будем сохранят
    // разархивированный расшифрованный массив
    if (GetSaveFileName(&ofn))
    {
        file_decompr.open(szFile);      
    }
    
 
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    thread second(fileDecompression);
    second.join();
 
    QueryPerformanceCounter(&timerStop);
    double const t_decode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время разархивации
 
    cout << "Время архивации: " << t_encode << " миллисекунд." << endl;
    cout << "Время разархивации: " << t_decode << " миллисекунд." << endl;
    cout << "Размер начального файла: " << initialFile << " байт." << endl;
    cout << "Размер сжатого файла: " << compressedFile << " байт." << endl;
    cout << "Размер расжатого файла: " << decompressedFile << " байт." << endl;
    cout << "Коэффициент сжатия: " << fixed << setprecision(2) << (decompressedFile / compressedFile) * 100 << "%" << endl;
    
 
    system("PAUSE");
 
    return 0;
}
С чего начать? Как правильно сделать разбиение данной программы на клиентскую программу и серверную?

Добавлено через 2 часа 20 минут
Проблема остается актуальной.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2016, 23:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание клиент-серверного приложения с применением межпроцессного взаимодействия на основе проекций файлов (C++):

Создание клиент-серверного приложения - C++
Здравствуйте! Вопрос наверное больше будет по теории. Если я его не в ту тему задал, то, пожалуйста, извините. Так вот. Знаю PHP,...

Создание клиент-серверного приложения - C++
Доброго дня. Необходимо написать программу обращения матрицы, она должна быть клиент серверной, то есть, пользователь вводит данные в...

Шифрование IP траффика клиент-серверного приложения - C++
Есть приложение типа клиент-сервер, надо реализовать механизм шифрования всего траффика между клиентом и сервером на основе быстрых...

Пример межпроцессного взаимодействия. Клиент-серверная модель - C Linux
Данный код был написан в рамках реализацией лабораторной работы по курсу UNIX. В данных приложениях реализован следующий функционал: ...

Создание клиент-серверного приложения - Delphi БД
Кто-нибудь, отзовитесь... Последняя надежда на вас! Я уже несколько дней пытаюсь сделать лабораторную по базам данных в delphi и все...

Создание клиент серверного приложения - Delphi БД
Доброго времени суток, уважаемые гуру программирования. Надеюсь на Ваш опыт и доброту. Собственно проблема такая: нужно создать СУБД,...

9
nmcf
5756 / 5067 / 1734
Регистрация: 14.04.2014
Сообщений: 20,749
09.12.2016, 10:07 #2

Не по теме:

Гениальное задание: в консольных приложениях использовать GetOpenFileName и MessageBox для выбора пользователя.


Упрощённо говоря, всё, кроме fileArchiving() и fileDecompression() остаётся в клиенте.
А как само взаимодействие-то происходит? Как сервер узнаёт, что пора выполнять обработку?
1
Undisputed
172 / 103 / 21
Регистрация: 10.06.2014
Сообщений: 1,427
Завершенные тесты: 3
09.12.2016, 12:16 #3
Цитата Сообщение от nmcf Посмотреть сообщение
А как само взаимодействие-то происходит? Как сервер узнаёт, что пора выполнять обработку?
Может нужно проверить дату последнего изменения файла? Если дата не соответствует предыдущей значит есть файл был изменен и есть новые данные

Добавлено через 1 минуту
Клиент проверяет файл сервера а сервер проверяет файл куда пишет клиент в цикле
1
nmcf
5756 / 5067 / 1734
Регистрация: 14.04.2014
Сообщений: 20,749
09.12.2016, 12:34 #4
Не очень удачная реализация с бесконечными проверками. Будет нагружать систему.
Ну делай хотя бы так. Для начала.
1
igdev
74 / 63 / 14
Регистрация: 22.04.2016
Сообщений: 340
Завершенные тесты: 2
09.12.2016, 20:21  [ТС] #5
nmcf, исходя из ваших рекомендаций, я так понимаю, что клиентское приложение будет примерно таким. Верно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <string>
#include <locale>
#include <vector>
#include <iomanip>
#include <sstream>
#include <thread>
 
 
using namespace std;
 
const int FIRST_SYMBOL = ' '; // первый символ
const int SYMBOL_NUMBER = 95; // для простоты кодируем только английский алфавит 
 
ifstream file;
ofstream file_compr;
ifstream f1;
ofstream file_decompr;
string text;
string gamma;
string result;
std::stringstream oss;
TCHAR szFile[1000]; // Адрес файла
double decompressedFile = 0; // Размер расжатого файла
 
 
void GammaCoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ti = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ti + Gi) % SYMBOL_NUMBER);
    }
}
 
void GammaDecoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ci = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ci - Gi + SYMBOL_NUMBER) % SYMBOL_NUMBER);
    }
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
 
 
 
    OPENFILENAME ofn;
 
    double initialFile = 0; // Размер начального файла
    double compressedFile = 0; // Размер сжатого файла
 
 
 
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile) / sizeof(TCHAR);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    // Display the Open dialog box. 
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        file.open(szFile);
    }
 
 
    cout << "Введите гамму: ";
    cin >> gamma;
 
    // Задаем файл для сохранения архивированного 
    // содержимого текста
    if (GetSaveFileName(&ofn))
    {
        file_compr.open(szFile);
    }
 
 
 
    // Производим шифрование 
    while (getline(file, text))
    {
        GammaCoding(text, gamma, result);
        file_compr << result;
    }
    
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        f1.open(szFile);
    }
 
 
    // Выбираем файл, куда будем сохранят
    // разархивированный расшифрованный массив
    if (GetSaveFileName(&ofn))
    {
        file_decompr.open(szFile);
    }
 
 
    // Делаем расшифрование
    while (getline(f1, result))
    {
        GammaDecoding(result, gamma, text);
        file_decompr << text << endl;
    }
 
    f1.close();
    file_decompr.close();
 
 
    system("PAUSE");
 
    return 0;
}
0
nmcf
5756 / 5067 / 1734
Регистрация: 14.04.2014
Сообщений: 20,749
09.12.2016, 22:26 #6
Нет. Зашифрованные данные должны быть в stringstream, как в первом варианте. В файл будет сжатое записывать.
0
igdev
74 / 63 / 14
Регистрация: 22.04.2016
Сообщений: 340
Завершенные тесты: 2
09.12.2016, 22:40  [ТС] #7
nmcf, т.е. вот так? Я правильно вас понял?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <string>
#include <locale>
#include <vector>
#include <iomanip>
#include <sstream>
#include <thread>
 
 
using namespace std;
 
const int FIRST_SYMBOL = ' '; // первый символ
const int SYMBOL_NUMBER = 95; // для простоты кодируем только английский алфавит 
 
ifstream file;
ofstream file_compr;
ifstream f1;
ofstream file_decompr;
string text;
string gamma;
string result;
std::stringstream oss;
TCHAR szFile[1000]; // Адрес файла
double decompressedFile = 0; // Размер расжатого файла
 
 
void GammaCoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ti = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ti + Gi) % SYMBOL_NUMBER);
    }
}
 
void GammaDecoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ci = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ci - Gi + SYMBOL_NUMBER) % SYMBOL_NUMBER);
    }
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
 
    OPENFILENAME ofn;
 
    double initialFile = 0; // Размер начального файла
    double compressedFile = 0; // Размер сжатого файла
 
 
 
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile) / sizeof(TCHAR);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    // Display the Open dialog box. 
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        file.open(szFile);
    }
 
    // Определяем размер начального файла
    file.seekg(0, std::ios::end);
    initialFile = file.tellg();
    file.seekg(0);
 
 
    cout << "Введите гамму: ";
    cin >> gamma;
 
    // Производим шифрование и полученый результат 
    // записываем в поток stringstream
    while (getline(file, text))
    {
        GammaCoding(text, gamma, result);
        oss << result;
    }
 
    // Обнуляем поток stringstream
    oss.str("");
    oss.clear();
 
 
    // Выбираем файл, куда будем сохранят
    // расшифрованный массив
    if (GetSaveFileName(&ofn))
    {
        file_decompr.open(szFile);
    }
 
    oss.seekg(0);
    while (getline(oss, result))
    {
        GammaDecoding(result, gamma, text);
        file_decompr << text << endl;
    }
 
    f1.close();
    file_decompr.close();
    
 
    system("PAUSE");
 
    return 0;
}
0
nmcf
5756 / 5067 / 1734
Регистрация: 14.04.2014
Сообщений: 20,749
10.12.2016, 09:50 #8
Где новое? Вместо вызова потоков в первом варианте должно быть обращение к серверу.
0
igdev
74 / 63 / 14
Регистрация: 22.04.2016
Сообщений: 340
Завершенные тесты: 2
10.12.2016, 12:13  [ТС] #9
nmcf, как осуществить обращение к серверу?

Не по теме:

Я впервые создаю клиент-серверное приложение и у меня нет как практического, так и теоретического опыта в этой области.

0
nmcf
5756 / 5067 / 1734
Регистрация: 14.04.2014
Сообщений: 20,749
10.12.2016, 13:28 #10
У тебя в задании всё описано. Сервер должен создать mapping, а клиент подключаться к нему по мере необходимости.
0
10.12.2016, 13:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2016, 13:28
Привет! Вот еще темы с ответами:

Создание простейшего клиент-серверного приложения - Delphi БД
делал всё по инструкции http://www.interface.ru/home.asp?artId=19397 дошёл до этого шага &quot;Вот на этом процесс создания примитивного...

Создание клиент-серверного приложения в Delphi 7 - Delphi БД
Создал БД в MSSQL Server 2008, создал клиент и серверное приложение для БД в Delphi 7, подскажите как сделать так чтобы она работала через...

Создание клиент-серверного приложения на C#.NET - C#
Руководство поставило задачу создать программу типа &quot;клиент-сервер&quot;, которая быстро инсталлируется на любой компьютер и не требует...

Создание клиент-серверного десктопного приложения с GUI на Java - Java
Добрый день, форумчане. Нужно написать десктопное клиент-серверное приложение с GUI на Java для выбора и вывода записей из БД. По сути...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.