E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
1

Настройка cmake

20.09.2022, 22:23. Показов 5112. Ответов 15

Author24 — интернет-сервис помощи студентам
Всем доброго времени!
Учебная задача предусматривает написать примитивный сервер HTTP, решил сделать его на основе libevent, скачала его с официального сайта и попробовал собрать его через cmake, входе чего получил следующую вывод и отсутствие результата.

Bash
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
... MINGW64 ~/source/libevent-2.1.12-stable (master)
$ cmake -G "Visual Studio 16 2019" .
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19044.
-- The C compiler identification is MSVC 19.28.29337.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.28.29333/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Found Git: C:/Program Files/Git/mingw64/bin/git.exe (found version "2.37.3.windows.1")
fatal: Not a valid object name HEAD
-- Looking for __GNU_LIBRARY__
-- Looking for __GNU_LIBRARY__ - not found
-- Looking for _GNU_SOURCE
-- Looking for _GNU_SOURCE - not found
-- Looking for include file fcntl.h
-- Looking for include file fcntl.h - found
-- Looking for include files fcntl.h, inttypes.h
-- Looking for include files fcntl.h, inttypes.h - found
-- Looking for 3 include files fcntl.h, ..., memory.h
-- Looking for 3 include files fcntl.h, ..., memory.h - found
-- Looking for 4 include files fcntl.h, ..., signal.h
-- Looking for 4 include files fcntl.h, ..., signal.h - found
-- Looking for 5 include files fcntl.h, ..., stdarg.h
-- Looking for 5 include files fcntl.h, ..., stdarg.h - found
-- Looking for 6 include files fcntl.h, ..., stddef.h
-- Looking for 6 include files fcntl.h, ..., stddef.h - found
-- Looking for 7 include files fcntl.h, ..., stdint.h
-- Looking for 7 include files fcntl.h, ..., stdint.h - found
-- Looking for 8 include files fcntl.h, ..., stdlib.h
-- Looking for 8 include files fcntl.h, ..., stdlib.h - found
-- Looking for 9 include files fcntl.h, ..., string.h
-- Looking for 9 include files fcntl.h, ..., string.h - found
-- Looking for 10 include files fcntl.h, ..., errno.h
-- Looking for 10 include files fcntl.h, ..., errno.h - found
-- Looking for 11 include files fcntl.h, ..., unistd.h
-- Looking for 11 include files fcntl.h, ..., unistd.h - not found
-- Looking for 11 include files fcntl.h, ..., time.h
-- Looking for 11 include files fcntl.h, ..., time.h - found
-- Looking for 12 include files fcntl.h, ..., sys/types.h
-- Looking for 12 include files fcntl.h, ..., sys/types.h - found
-- Looking for 13 include files fcntl.h, ..., sys/stat.h
-- Looking for 13 include files fcntl.h, ..., sys/stat.h - found
-- Looking for 14 include files fcntl.h, ..., sys/time.h
-- Looking for 14 include files fcntl.h, ..., sys/time.h - not found
-- Looking for 14 include files fcntl.h, ..., sys/param.h
-- Looking for 14 include files fcntl.h, ..., sys/param.h - not found
-- Looking for 14 include files fcntl.h, ..., io.h
-- Looking for 14 include files fcntl.h, ..., io.h - found
-- Looking for 15 include files fcntl.h, ..., winsock2.h
-- Looking for 15 include files fcntl.h, ..., winsock2.h - found
-- Looking for 16 include files fcntl.h, ..., ws2tcpip.h
-- Looking for 16 include files fcntl.h, ..., ws2tcpip.h - found
-- Looking for 17 include files fcntl.h, ..., afunix.h
-- Looking for 17 include files fcntl.h, ..., afunix.h - found
-- Looking for 18 include files fcntl.h, ..., sys/sysctl.h
-- Looking for 18 include files fcntl.h, ..., sys/sysctl.h - not found
-- Looking for getaddrinfo
-- Looking for getaddrinfo - found
-- Looking for getnameinfo
-- Looking for getnameinfo - found
-- Looking for getprotobynumber
-- Looking for getprotobynumber - found
-- Looking for getservbyname
-- Looking for getservbyname - found
-- Looking for gethostbyname
-- Looking for gethostbyname - found
-- Looking for inet_ntop
-- Looking for inet_ntop - found
-- Looking for inet_pton
-- Looking for inet_pton - found
-- Looking for gettimeofday
-- Looking for gettimeofday - not found
-- Looking for signal
-- Looking for signal - found
-- Looking for strtoll
-- Looking for strtoll - found
-- Looking for splice
-- Looking for splice - not found
-- Looking for strlcpy
-- Looking for strlcpy - not found
-- Looking for strsep
-- Looking for strsep - not found
-- Looking for strtok_r
-- Looking for strtok_r - not found
-- Looking for vasprintf
-- Looking for vasprintf - not found
-- Looking for timerclear
-- Looking for timerclear - found
-- Looking for timercmp
-- Looking for timercmp - found
-- Looking for timerisset
-- Looking for timerisset - found
-- Looking for timeradd
-- Looking for timeradd - not found
-- Looking for nanosleep
-- Looking for nanosleep - not found
-- Looking for putenv
-- Looking for putenv - found
-- Looking for umask
-- Looking for umask - found
-- Looking for clock_gettime
-- Looking for clock_gettime - not found
-- Looking for _gmtime64_s
-- Looking for _gmtime64_s - found
-- Looking for _gmtime64
-- Looking for _gmtime64 - found
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of struct sockaddr_un
-- Check size of struct sockaddr_un - done
-- Check size of uint8_t
-- Check size of uint8_t - done
-- Check size of uint16_t
-- Check size of uint16_t - done
-- Check size of uint32_t
-- Check size of uint32_t - done
-- Check size of uint64_t
-- Check size of uint64_t - done
-- Check size of short
-- Check size of short - done
-- Check size of int
-- Check size of int - done
-- Check size of unsigned
-- Check size of unsigned - done
-- Check size of unsigned int
-- Check size of unsigned int - done
-- Check size of long
-- Check size of long - done
-- Check size of long long
-- Check size of long long - done
-- Performing Test HAVE_INLINE
-- Performing Test HAVE_INLINE - Success
-- Looking for __func__
-- Looking for __func__ - found
-- Looking for __FUNCTION__
-- Looking for __FUNCTION__ - found
-- Looking for TAILQ_FOREACH
-- Looking for TAILQ_FOREACH - not found
-- Performing Test EVENT__HAVE_DECL_CTL_KERN
-- Performing Test EVENT__HAVE_DECL_CTL_KERN - Failed
-- Looking for CTL_KERN - not found
-- Performing Test EVENT__HAVE_DECL_KERN_ARND
-- Performing Test EVENT__HAVE_DECL_KERN_ARND - Failed
-- Looking for KERN_ARND - not found
-- Looking for F_SETFD
-- Looking for F_SETFD - not found
-- Check size of fd_mask
-- Check size of fd_mask - failed
-- Check size of size_t
-- Check size of size_t - done
-- Check size of off_t
-- Check size of off_t - done
-- Check size of ssize_t
-- Check size of ssize_t - failed
-- Check size of SSIZE_T
-- Check size of SSIZE_T - done
-- Check size of socklen_t
-- Check size of socklen_t - done
-- Check size of pid_t
-- Check size of pid_t - failed
-- Check size of pthread_t
-- Check size of pthread_t - failed
-- Check size of uintptr_t
-- Check size of uintptr_t - done
-- Check size of void *
-- Check size of void * - done
-- Check size of time_t
-- Check size of time_t - done
-- Check size of struct addrinfo
-- Check size of struct addrinfo - done
-- Check size of struct in6_addr
-- Check size of struct in6_addr - done
-- Performing Test EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16
-- Performing Test EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16 - Failed
-- Performing Test EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32
-- Performing Test EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32 - Failed
-- Check size of sa_family_t
-- Check size of sa_family_t - failed
-- Check size of struct sockaddr_in6
-- Check size of struct sockaddr_in6 - done
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN - Failed
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN - Failed
-- Check size of struct sockaddr_storage
-- Check size of struct sockaddr_storage - done
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY - Success
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
-- Performing Test EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY - Failed
-- Check size of struct linger
-- Check size of struct linger - done
CMake Error at C:/Program Files/CMake/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY
  OPENSSL_INCLUDE_DIR)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.24/Modules/FindOpenSSL.cmake:599 (find_package_handle_standard_args)
  CMakeLists.txt:844 (find_package)
 
 
-- Configuring incomplete, errors occurred!
See also "C:/Users/.../source/libevent-2.1.12-stable/CMakeFiles/CMakeOutput.log".
See also "C:/Users/.../source/libevent-2.1.12-stable/CMakeFiles/CMakeError.log".
Что я делаю не так и что я должен сделать так как надо, всем спасибо за внимание и за совет.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2022, 22:23
Ответы с готовыми решениями:

Литература CMake
Доброго времени суток! Изучаю С++ и хочу научится пользоваться СMake -ом, так как в большинстве...

Исходники - CMake - пакеты
Добрый день. Коллеги, я совершенно запутался и прошу Вашей помощи. Предыстория ( можно...

Cmake проект сборки документации
Здравствуйте, хочу сделать проект со сборкой документации, что-то типо doxygen target example. В...

Создание цели скрипта в cmake
Приветствую. Возникла следующая проблема, не как не могу найти как добавить произвольную цель в...

Как добавить путь в CMake
Привет всем. Как мне добавить путь к CMake? Интересует только для Windows, для других платформ все...

15
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
20.09.2022, 22:30 2
Лучший ответ Сообщение было отмечено K_ILYA_V как решение

Решение

Написано же
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)
Не находит библиотеку OpenSSL

Добавлено через 4 минуты
Цитата Сообщение от K_ILYA_V Посмотреть сообщение
примитивный сервер HTTP, решил сделать его на основе libevent
Имхо проще на бусте (asio + beast), вот мой пример блокирующего однопоточного
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <filesystem>
#include <string>
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include <fstream>
 
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
          boost::beast::http::response<boost::beast::http::dynamic_body> &response);
std::string mimeType(const std::string &path);
 
int main(int argc, char **argv) {
    if (argc == 1) {
        std::string name{std::filesystem::path{argv[0]}.filename().string()};
        std::cout << "use: " << name << " [port]" << std::endl;
    }
    uint16_t port{8080};
    if (argc == 2) {
        port = std::stoi(argv[1]);
    }
    try {
        boost::asio::io_context ioc{};
        boost::asio::ip::tcp::endpoint ep{boost::asio::ip::tcp::v4(), port};
        boost::asio::ip::tcp::acceptor acceptor{ioc, ep};
        std::cout << "server run on port: " << port << std::endl;
        while (true) {
            boost::asio::ip::tcp::socket socket{ioc};
            acceptor.accept(socket);
            boost::beast::http::request<boost::beast::http::dynamic_body> request{};
            boost::beast::flat_buffer buffer{};
            boost::beast::http::read(socket, buffer, request);
            boost::beast::http::response<boost::beast::http::dynamic_body> response{};
            work(request, response);
            boost::beast::http::write(socket, response);
            socket.close();
        }
    } catch(boost::system::system_error &e) {
        std::cout << e.what() << std::endl;
        return -1;
    }
}
 
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
          boost::beast::http::response<boost::beast::http::dynamic_body> &response) {
    response.version(request.version());
    response.keep_alive(false);
    std::string path{request.target()};
    std::cout << "connection: " << path << std::endl;
    if (path == "/") {
        response.result(boost::beast::http::status::ok);
        response.set(boost::beast::http::field::content_type, "text/html");
        boost::beast::ostream(response.body()) << "<!DOCTYPE html><html><head><title>Main page</title><head>"
                                               << "<body><h1 align=\"center\">Hello, World!</h1></body></html>" << std::endl;
        response.content_length(response.body().size());
        return;
    }
    if (path[0] == '/') {
        path = path.substr(1);
    }
    if (path.find('?') != std::string::npos) {
        path = path.substr(0, path.find('?'));
    }
    if (std::filesystem::exists(path)) {
        std::streamsize sz{static_cast<std::streamsize>(std::filesystem::file_size(path))};
        std::vector<char> data(sz);
        std::ifstream file{path, std::ios::binary};
        file.read(data.data(), sz);
        file.close();
        response.result(boost::beast::http::status::ok);
        response.set(boost::beast::http::field::content_type, mimeType(path));
        boost::beast::ostream(response.body()).write(data.data(), sz);
        response.content_length(sz);
    } else {
        response.result(boost::beast::http::status::not_found);
        response.set(boost::beast::http::field::content_type, "text/html");
        boost::beast::ostream(response.body()) << "<!DOCTYPE html><html><head><title>Not Found</title><head>"
                                          << "<body><h1 align=\"center\">404 Not found</h1></body></html>" << std::endl;
        response.content_length(response.body().size());
    }
}
 
std::string mimeType(const std::string &path) {
    std::string ext{std::filesystem::path(path).extension().string()};
    if (ext == ".htm" || ext == ".html") return "text/html";
    if (ext == ".php") return "application/php";
    if (ext == ".css") return "text/css";
    if (ext == ".txt") return "text/plain";
    if (ext == ".js") return "application/javascript";
    if (ext == ".json") return "application/json";
    if (ext == ".gz") return "application/gzip";
    if (ext == ".tar") return "application/x-tar";
    if (ext == ".rar") return "application/vnd.rar";
    if (ext == ".zip") return "application/zip";
    if (ext == ".7z") return "application/x-7z-compressed";
    if (ext == ".pdf") return "application/pdf";
    if (ext == ".xml") return "application/xml";
    if (ext == ".swf") return "application/x-shockwave-flash";
    if (ext == ".flv") return "video/x-flv";
    if (ext == ".png") return "image/png";
    if (ext == ".jpeg" || ext == ".jpg" || ext == ".jpe") return "image/jpeg";
    if (ext == ".gif") return "image/gif";
    if (ext == ".bmp") return "image/bmp";
    if (ext == ".ico") return "image/vnd.microsoft.icon";
    if (ext == ".tiff" || ext == ".tif") return "image/tiff";
    if (ext == ".svg" || ext == ".svgz") return "image/svg+xml";
    return "application/text";
}

Буст собирается и без openssl, а так же у него своя система сборки
0
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
20.09.2022, 22:30  [ТС] 3
Цитата Сообщение от alecss131 Посмотреть сообщение
Написано же

Не находит библиотеку OpenSSL

Добавлено через 4 минуты

Имхо проще на бусте (asio + beast), вот мой пример блокирующего однопоточного
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <filesystem>
#include <string>
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include <fstream>
 
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
          boost::beast::http::response<boost::beast::http::dynamic_body> &response);
std::string mimeType(const std::string &path);
 
int main(int argc, char **argv) {
    if (argc == 1) {
        std::string name{std::filesystem::path{argv[0]}.filename().string()};
        std::cout << "use: " << name << " [port]" << std::endl;
    }
    uint16_t port{8080};
    if (argc == 2) {
        port = std::stoi(argv[1]);
    }
    try {
        boost::asio::io_context ioc{};
        boost::asio::ip::tcp::endpoint ep{boost::asio::ip::tcp::v4(), port};
        boost::asio::ip::tcp::acceptor acceptor{ioc, ep};
        std::cout << "server run on port: " << port << std::endl;
        while (true) {
            boost::asio::ip::tcp::socket socket{ioc};
            acceptor.accept(socket);
            boost::beast::http::request<boost::beast::http::dynamic_body> request{};
            boost::beast::flat_buffer buffer{};
            boost::beast::http::read(socket, buffer, request);
            boost::beast::http::response<boost::beast::http::dynamic_body> response{};
            work(request, response);
            boost::beast::http::write(socket, response);
            socket.close();
        }
    } catch(boost::system::system_error &e) {
        std::cout << e.what() << std::endl;
        return -1;
    }
}
 
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
          boost::beast::http::response<boost::beast::http::dynamic_body> &response) {
    response.version(request.version());
    response.keep_alive(false);
    std::string path{request.target()};
    std::cout << "connection: " << path << std::endl;
    if (path == "/") {
        response.result(boost::beast::http::status::ok);
        response.set(boost::beast::http::field::content_type, "text/html");
        boost::beast::ostream(response.body()) << "<!DOCTYPE html><html><head><title>Main page</title><head>"
                                               << "<body><h1 align=\"center\">Hello, World!</h1></body></html>" << std::endl;
        response.content_length(response.body().size());
        return;
    }
    if (path[0] == '/') {
        path = path.substr(1);
    }
    if (path.find('?') != std::string::npos) {
        path = path.substr(0, path.find('?'));
    }
    if (std::filesystem::exists(path)) {
        std::streamsize sz{static_cast<std::streamsize>(std::filesystem::file_size(path))};
        std::vector<char> data(sz);
        std::ifstream file{path, std::ios::binary};
        file.read(data.data(), sz);
        file.close();
        response.result(boost::beast::http::status::ok);
        response.set(boost::beast::http::field::content_type, mimeType(path));
        boost::beast::ostream(response.body()).write(data.data(), sz);
        response.content_length(sz);
    } else {
        response.result(boost::beast::http::status::not_found);
        response.set(boost::beast::http::field::content_type, "text/html");
        boost::beast::ostream(response.body()) << "<!DOCTYPE html><html><head><title>Not Found</title><head>"
                                          << "<body><h1 align=\"center\">404 Not found</h1></body></html>" << std::endl;
        response.content_length(response.body().size());
    }
}
 
std::string mimeType(const std::string &path) {
    std::string ext{std::filesystem::path(path).extension().string()};
    if (ext == ".htm" || ext == ".html") return "text/html";
    if (ext == ".php") return "application/php";
    if (ext == ".css") return "text/css";
    if (ext == ".txt") return "text/plain";
    if (ext == ".js") return "application/javascript";
    if (ext == ".json") return "application/json";
    if (ext == ".gz") return "application/gzip";
    if (ext == ".tar") return "application/x-tar";
    if (ext == ".rar") return "application/vnd.rar";
    if (ext == ".zip") return "application/zip";
    if (ext == ".7z") return "application/x-7z-compressed";
    if (ext == ".pdf") return "application/pdf";
    if (ext == ".xml") return "application/xml";
    if (ext == ".swf") return "application/x-shockwave-flash";
    if (ext == ".flv") return "video/x-flv";
    if (ext == ".png") return "image/png";
    if (ext == ".jpeg" || ext == ".jpg" || ext == ".jpe") return "image/jpeg";
    if (ext == ".gif") return "image/gif";
    if (ext == ".bmp") return "image/bmp";
    if (ext == ".ico") return "image/vnd.microsoft.icon";
    if (ext == ".tiff" || ext == ".tif") return "image/tiff";
    if (ext == ".svg" || ext == ".svgz") return "image/svg+xml";
    return "application/text";
}

Буст собирается и без openssl, а так же у него своя система сборки
Окей. Если с вопросом кто виноват стало понятно (пока правда не мне), то меня очень волнует второй вопрос что делать.
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
20.09.2022, 22:37 4
Цитата Сообщение от K_ILYA_V Посмотреть сообщение
что делать
Собрать Openssl и указать путь до либы в переменной OPENSSL_ROOT_DIR

Добавлено через 1 минуту
Потом могут другие зависимости вылезти))
0
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
20.09.2022, 22:39  [ТС] 5
Цитата Сообщение от alecss131 Посмотреть сообщение
Собрать Openssl и указать путь до либы в переменной OPENSSL_ROOT_DIR

Добавлено через 1 минуту
Потом могут другие зависимости вылезти))
Окей. Я изучаю Ваш пример и буду сегодня его пробовать. Если получиться то вопрос про Openssl можно будет отложить.
0
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
21.09.2022, 15:43  [ТС] 6
Добавлено через 48 секунд
Цитата Сообщение от alecss131 Посмотреть сообщение
...
Уважаемый @alecss131 по причине жестких сроков вынужден просить Вас дополнительно подсказать мне как модернизировать Ваш код чтобы передать/отправить JPG изображение от сервера к клиенту.
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
21.09.2022, 15:52 7
K_ILYA_V, Собрать код в исполняемый файл и положить нужные файлы рядом с ним. По сути все. Сервер выдает по запросу файлы которые рядом с ним лежат, например запрос 127.0.0.1:8080/file.jpg покажет в браузере картинку file.jpg которая лежит рядом с сервером.
А вот в обратную сторону, от клиента к серверу функционала нету. То есть сервер примет файл но ничего с ним делать не будет.
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
21.09.2022, 15:57 8
Вот пример на картинке, в качестве клиента браузер
Настройка cmake

Еще корректно будут отображаться и работать html странички с css/js и картинками, если их как картинку положить рядом с сервером и вызвать из браузера через сервер
0
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
21.09.2022, 16:05  [ТС] 9
Мое задание получить JPG по протоколу HTTP изменить ее и отправить обратно. Та часть кода которая будет менять картинку не представляет для меня проблемы, новое для меня это HTTP и его использование.

Мне нужно понять как положить двоичные данные в запрос и отослать их обратно.

Как изменить JPG я разберусь сам. К вам я обращаюсь чтобы иметь подстраховку по времени и не опоздать запутавшись с boost.

Добавлено через 5 минут
alecss131

Добавлено через 1 минуту
Сейчас я пока вижу только один прямой путь просто читать ответ как строку чтобы вынуть из него файл, но я предполагаю, надеюсь что есть уже готовая функция для того чтобы вынуть бинарные данные.
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
21.09.2022, 16:16 10
K_ILYA_V, Сервер должен получить картинку, изменить ее и отправить обратно? Или клиент должен получить картинку от сервера изменить ее и отправить обратно серверу, а сервер ее где нибудь сохранить?
0
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
21.09.2022, 16:17  [ТС] 11
alecss131 Сервер должен получить картинку и изменить ее и отправить клиенту. Как изменить картинку у меня сложностей нет, мне очень интересно как ее извлечь и прикрепить обратно.
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
21.09.2022, 16:27 12
Цитата Сообщение от K_ILYA_V Посмотреть сообщение
как ее извлечь и прикрепить обратно
Цитата Сообщение от alecss131 Посмотреть сообщение
C++
9
10
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
 boost::beast::http::response<boost::beast::http::dynamic_body> &response);
Надо менять вот эту функцию тогда, точнее в ней уже все извлечено и обратно упаковывается без проблем.
У реквеста и респонса есть тело (body) и знаком его размер, в нем и лежит картинка

Добавлено через 34 секунды
Boost::beast как раз тут для того и есть чтобы руками не парсить/писать http пакеты.

Добавлено через 2 минуты
Вернуть картинку так
C++
1
2
3
boost::beast::ostream(response.body()).write(...) //простой поток для записи, сюда писать бинарные данные картинки
response.content_length(response.body().size()); //не забыть записать размер данных
response.set(boost::beast::http::field::content_type, "image/jpeg"); //а так же указать что возвращаем картинку
Добавлено через 2 минуты
Прочитать похоже должно быть
C++
1
2
int size = request.body().size(); //размер данных картинки
boost::beast::istream(request.body()).read(...) //читаем картинку
0
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
21.09.2022, 16:34  [ТС] 13
Большое спасибо за подсказки alecss131, буду сегодня вечером проверять отлаживать.

sanguis et honor!
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
21.09.2022, 21:47 14
K_ILYA_V, С чтением я немного промахнулся, извиняюсь, там немного сложнее
вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
          boost::beast::http::response<boost::beast::http::dynamic_body> &response) {
    std::cout << "connection" << std::endl;
    std::vector<char> data(request.body().size());
    char *d{data.data()};
    for (auto buffer : request.body().data()) {
        int s{static_cast<int>(buffer.size())};
        const char *c{boost::asio::buffer_cast<const char*>(buffer)};
        std::memcpy(d, c, s);
        d += s;
    }
 
    //std::vector<char> data - contains all image bytes
    std::ofstream test{"test.jpg", std::ios::binary};
    if (test.is_open()) {
        test.write(data.data(), static_cast<int>(data.size()));
    }
 
    boost::beast::ostream(response.body()).write(data.data(), static_cast<int>(data.size()));
    response.content_length(response.body().size());
    response.version(request.version());
    response.keep_alive(false);
}
Вектор data содержит байтики от картинки которая пришла на сервер, их и надо модифицировать, можно в коде выше вместо записи на диск, после комментария.
0
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
21.09.2022, 21:50  [ТС] 15
Спасибо. Я уже столкнулся что чтение сложней и уже успел придумать свой велосипед, но очень большое спасибо за внимание к моему вопросу.

C++
1
auto data = static_cast<const unsigned char*>((*request.body().data().begin()).data());
Теперь занят анализом изображения и его поворотом. Это оказалось гораздо интересней.
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
21.09.2022, 21:54 16
Цитата Сообщение от K_ILYA_V Посмотреть сообщение
свой велосипед
Советую обратить внимание что там данные хранятся не в 1 буфере, в моем варианте там перебираются все буферы, например на 4кб картинке у меня было аж 3 буфера

Добавлено через 37 секунд
request.body().data() это набор буферов
0
21.09.2022, 21:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2022, 21:54
Помогаю со студенческими работами здесь

Cmake и компиляция исходного кода
Всем здравствуйте, есть небольшой вопрос по компиляции исходного кода приложений. Краткое...

cmake. подключение фалов заголовков
Здравствуйте. Не понимаю где ошибка. У меня след. структура файлов: + MyGame/ . - build/ . +...

CMake и организация сборки проекта
В общем, вопрос таков: каким образом можно &quot;наставить&quot; cmake, чтобы он собирал бинарники в одной...

Cmake с MinGW - сборка dll
Хочу создать dll, которое будет содержать модули приложения, использующие SDL2. Но в данный момент...

CMake, QtCreator. Библиотеки и запуск приложения
Пишу свою маленькую динамическую бибилотеку библиотеку. Структура проекта следующая: project\ ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru