Страница 1 из 1
веб-сервер
Добавлено: 14 авг 2024, 10:09
ya
Код: Выделить всё
#include <iostream>
#include <string>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
const int PORT = 8080;
const int BACKLOG = 10;
std::string generateHTML() {
return
"HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Connection: close\n"
"\n"
"<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Simple C++ Web Server</title>"
"</head>"
"<body>"
"<h1>Welcome to my simple C++ web server!</h1>"
"<p>This page is served using a C++ program.</p>"
"</body>"
"</html>";
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
// Создание сокета
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
// Привязываем сокет к порту
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, BACKLOG) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
std::cout << "Server is listening on port " << PORT << std::endl;
while (true) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
std::string response = generateHTML();
send(new_socket, response.c_str(), response.size(), 0);
close(new_socket);
}
return 0;
}
Компиляция:
g++ -std=c++11 simple_web_server.cpp -o simple_web_server
Запуск:
./simple_web_server
Доступнен через веб-бразузер
http://localhost:8080.
Re: веб-сервер
Добавлено: 14 авг 2024, 12:26
ya
v-1.0.1
Код: Выделить всё
#include <iostream>
#include <string>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
const int PORT = 8070;
const int BACKLOG = 10;
std::string generateHTML() {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Простой веб вервер, написанный на плюсах</h1>"
"<p>Более подробно можно ознакомиться в теме: <a href=https://sys.hardprivate.com/viewtopic.php?f=14&t=947>веб-сервер на плюсах</p>"
"</body>"
"</html>";
return "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close\n"
"\n" + body;
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, BACKLOG) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
std::cout << "Server is listening on port " << PORT << std::endl;
while (true) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
std::string response = generateHTML();
char buffer[1024] = {0};
read(new_socket, buffer, 1024);
std::cout << "Received request:\n" << buffer << std::endl;
send(new_socket, response.c_str(), response.size(), 0);
close(new_socket);
}
return 0;
}
доступен на порту 8070
Re: веб-сервер
Добавлено: 14 авг 2024, 14:34
ya
добавлены post и get запросы
v-1.0.2
Код: Выделить всё
#include <iostream>
#include <string>
#include <cstring>
#include <sstream> // Required for std::istringstream
#include <unistd.h>
#include <arpa/inet.h>
const int PORT = 8070;
const int BACKLOG = 10;
const int BUFFER_SIZE = 1024;
std::string handleGET(const std::string& path) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали GET запрос на путь: " + path + "</h1>"
"</body>"
"</html>";
return "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close\n"
"\n" + body;
}
std::string handlePOST(const std::string& data) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали POST запрос с данными:</h1>"
"<pre>" + data + "</pre>"
"</body>"
"</html>";
return "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close\n"
"\n" + body;
}
std::string parseRequest(const std::string& request) {
std::string method, path, data;
std::istringstream request_stream(request);
request_stream >> method >> path; // Получаем метод и путь
std::string line;
while (std::getline(request_stream, line) && line != "") {
// Собираем заголовки, но они нам не нужны в этом примере
}
// Если это POST запрос, то нужно получить данные
if (method == "POST") {
// Получаем длину содержимого
while (std::getline(request_stream, line)) {
if (line.find("Content-Length: ") != std::string::npos) {
int content_length = std::stoi(line.substr(16));
data.resize(content_length);
request_stream.read(&data[0], content_length);
break;
}
}
return handlePOST(data);
} else if (method == "GET") {
return handleGET(path);
}
return "HTTP/1.1 405 Method Not Allowed\n"
"Connection: close\n"
"\n";
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, BACKLOG) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
std::cout << "Server is listening on port " << PORT << std::endl;
while (true) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE] = {0};
read(new_socket, buffer, BUFFER_SIZE);
std::string request(buffer);
std::cout << "Received request:\n" << request << std::endl;
std::string response = parseRequest(request);
send(new_socket, response.c_str(), response.size(), 0);
close(new_socket);
}
return 0;
}
Re: веб-сервер
Добавлено: 14 авг 2024, 15:28
ya
v-1.0.3
Код: Выделить всё
#include <iostream>
#include <string>
#include <cstring>
#include <sstream> // Required for std::istringstream
#include <unistd.h>
#include <arpa/inet.h>
const int PORT = 8070;
const int BACKLOG = 10;
const int BUFFER_SIZE = 1024;
std::string handleGET(const std::string& path) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали GET запрос на путь: " + path + "</h1>"
"<form action='/' method='POST'>"
"<input type='text' name='send_text'>"
"<input type='submit' value='Submit'>"
"</form>"
"</body>"
"</html>";
return "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close\n"
"\n" + body;
}
std::string handlePOST(const std::string& data) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали POST запрос с данными:</h1>"
"<pre>" + data + "</pre>"
"</body>"
"</html>";
return "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close\n"
"\n" + body;
}
std::string parseRequest(const std::string& request) {
std::string method, path, data;
std::istringstream request_stream(request);
request_stream >> method >> path; // Получаем метод и путь
std::string line;
while (std::getline(request_stream, line) && line != "") {
// Собираем заголовки, но они нам не нужны в этом примере
}
// Если это POST запрос, то нужно получить данные
if (method == "POST") {
// Получаем длину содержимого
while (std::getline(request_stream, line)) {
if (line.find("Content-Length: ") != std::string::npos) {
int content_length = std::stoi(line.substr(16));
data.resize(content_length);
request_stream.read(&data[0], content_length);
break;
}
}
return handlePOST(line);
} else if (method == "GET") {
return handleGET(path);
}
return "HTTP/1.1 405 Method Not Allowed\n"
"Connection: close\n"
"\n";
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, BACKLOG) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
std::cout << "Server is listening on port " << PORT << std::endl;
while (true) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE] = {0};
read(new_socket, buffer, BUFFER_SIZE);
std::string request(buffer);
std::cout << "Received request:\n" << request << std::endl;
std::string response = parseRequest(request);
send(new_socket, response.c_str(), response.size(), 0);
close(new_socket);
}
return 0;
}
Re: веб-сервер
Добавлено: 14 авг 2024, 17:47
ya
v-1.0.4
Код: Выделить всё
#include <iostream>
#include <string>
#include <cstring>
#include <sstream> // Required for std::istringstream
#include <unistd.h>
#include <arpa/inet.h>
#include <map>
const int PORT = 8070;
const int BACKLOG = 10;
const int BUFFER_SIZE = 1024;
std::map<std::string, std::string> parseData(const std::string& data) {
std::map<std::string, std::string> result;
std::string keyValuePair;
std::istringstream stream(data);
while (std::getline(stream, keyValuePair, '&')) {
size_t pos = keyValuePair.find('=');
if (pos != std::string::npos) {
std::string key = keyValuePair.substr(0, pos);
std::string value = keyValuePair.substr(pos + 1);
result[key] = value;
}
}
return result;
}
std::string handleGET(const std::string& path) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали GET запрос на путь: " + path + "</h1>"
"<form action='/' method='POST'>"
"<input type='text' name='send_text'>"
"<br>"
"<input type='text' name='send_text222'>"
"<input type='submit' value='Submit'>"
"</form>"
"</body>"
"</html>";
return "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close\n"
"\n" + body;
}
std::string handlePOST(const std::string& data) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали POST запрос с данными:</h1>"
"<pre>" + data + "</pre>"
"</body>"
"</html>";
return "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=utf-8\n"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close\n"
"\n" + body;
}
std::string parseRequest(const std::string& request) {
std::string method, path, data;
std::istringstream request_stream(request);
request_stream >> method >> path; // Получаем метод и путь
std::string line;
while (std::getline(request_stream, line) && line != "") {
// Собираем заголовки, но они нам не нужны в этом примере
}
// Если это POST запрос, то нужно получить данные
if (method == "POST") {
// Получаем длину содержимого
while (std::getline(request_stream, line)) {
if (line.find("Content-Length: ") != std::string::npos) {
int content_length = std::stoi(line.substr(16));
data.resize(content_length);
request_stream.read(&data[0], content_length);
break;
}
}
std::ostringstream oss; // Создаем ostringstream для форматирования строки
//Begin Парсинг POST данных на: ключ = значение
std::map<std::string, std::string> parsedData = parseData(line);
for (const auto& pair : parsedData) {
oss << pair.first << " = " << pair.second << " <br> "<< std::endl;
}
//End Парсинг POST данных на: ключ = значение
return handlePOST(oss.str());
} else if (method == "GET") {
return handleGET(path);
}
return "HTTP/1.1 405 Method Not Allowed\n"
"Connection: close\n"
"\n";
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, BACKLOG) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
std::cout << "Server is listening on port " << PORT << std::endl;
while (true) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE] = {0};
read(new_socket, buffer, BUFFER_SIZE);
std::string request(buffer);
std::cout << "Received request:\n" << request << std::endl;
std::string response = parseRequest(request);
send(new_socket, response.c_str(), response.size(), 0);
close(new_socket);
}
return 0;
}
Добавлен парсинг POST-запроса
тоже самое, но с применением шаблона проектированя mvc:
Код: Выделить всё
#include <iostream>
#include <string>
#include <cstring>
#include <sstream>
#include <unistd.h>
#include <arpa/inet.h>
#include <map>
const int PORT = 8070;
const int BACKLOG = 10;
const int BUFFER_SIZE = 1024;
// Model
class Model {
public:
std::map<std::string, std::string> parseData(const std::string& data) {
std::map<std::string, std::string> result;
std::string keyValuePair;
std::istringstream stream(data);
while (std::getline(stream, keyValuePair, '&')) {
size_t pos = keyValuePair.find('=');
if (pos != std::string::npos) {
std::string key = keyValuePair.substr(0, pos);
std::string value = keyValuePair.substr(pos + 1);
result[key] = value;
}
}
return result;
}
};
// View
class View {
public:
std::string generateGETResponse(const std::string& path) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали GET запрос на путь: " + path + "</h1>"
"<form action='/' method='POST'>"
"<input type='text' name='send_text'>"
"<br>"
"<input type='text' name='send_text222'>"
"<input type='submit' value='Submit'>"
"</form>"
"</body>"
"</html>";
return buildResponse(body);
}
std::string generatePOSTResponse(const std::string& data) {
std::string body = "<!DOCTYPE html>"
"<html lang='en'>"
"<head>"
"<meta charset='UTF-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>Простой C++ Веб-сервер</title>"
"</head>"
"<body>"
"<h1>Вы сделали POST запрос с данными:</h1>"
"<pre>" + data + "</pre>"
"</body>"
"</html>";
return buildResponse(body);
}
private:
std::string buildResponse(const std::string& body) {
return "HTTP/1.1 200 OK
"
"Content-Type: text/html; charset=utf-8
"
"Content-Length: " + std::to_string(body.size()) + "\n"
"Connection: close
"
"\n" + body;
}
};
// Controller
class Controller {
public:
Controller(Model& model, View& view) : model(model), view(view) {}
std::string handleRequest(const std::string& request) {
std::string method, path, data;
std::istringstream request_stream(request);
request_stream >> method >> path;
std::string line;
while (std::getline(request_stream, line) && !line.empty()) {
// Skip headers
}
if (method == "POST") {
while (std::getline(request_stream, line)) {
if (line.find("Content-Length: ") != std::string::npos) {
int content_length = std::stoi(line.substr(16));
data.resize(content_length);
request_stream.read(&data[0], content_length);
break;
}
}
// Parse POST data
std::map<std::string, std::string> parsedData = model.parseData(data);
std::ostringstream oss;
for (const auto& pair : parsedData) {
oss << pair.first << " = " << pair.second << " <br> " << std::endl;
}
return view.generatePOSTResponse(oss.str());
} else if (method == "GET") {
return view.generateGETResponse(path);
}
return "HTTP/1.1 405 Method Not Allowed
Connection: close
";
}
private:
Model& model;
View& view;
};
// Main function
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, BACKLOG) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
std::cout << "Server is listening on port " << PORT << std::endl;
Model model;
View view;
Controller controller(model, view);
while (true) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE] = {0};
read(new_socket, buffer, BUFFER_SIZE);
std::string request(buffer);
std::cout << "Received request:\n" << request << std::endl;
std::string response = controller.handleRequest(request);
send(new_socket, response.c_str(), response.size(), 0);
close(new_socket);
}
return 0;
}
Re: веб-сервер
Добавлено: 14 авг 2024, 19:57
ya
Re: веб-сервер
Добавлено: 16 авг 2024, 11:43
ya
Добавлено создание вируалок на qemu v-1.0.5
для компиляции:
Re: веб-сервер
Добавлено: 16 авг 2024, 15:02
ya
Добавлен второй стевой интерфейс direct и добавлена проверка наличия/отсутствия vnc-пароля v-1.0.6
Re: веб-сервер
Добавлено: 20 авг 2024, 12:08
ya
добавлена обработка запросов в бд mariadb
Код: Выделить всё
sudo apt install libmariadb-dev libmariadb-dev-compat
Код: Выделить всё
g++ -std=c++11 -o webs5 webs5.cpp -I/usr/include/mariadb/mysql -L/usr/lib/mysql -lmariadb -lmysqlcppconn -lmysqlclient_r
Re: веб-сервер
Добавлено: 20 авг 2024, 17:07
ya
Добавлена регистрация пользователя в базе данных mariadb
Компилировать:
Код: Выделить всё
g++ -std=c++11 -o webs5 webs5.cpp -I/usr/include/mariadb/mysql -L/usr/lib/mysql -lmariadb -lmysqlcppconn -lmysqlclient_r
Re: веб-сервер
Добавлено: 21 авг 2024, 16:24
ya
Синхронный веб-сервер заменён на асинхронный
для компиляции:
Код: Выделить всё
g++ -std=c++11 -o webs5 webs5.cpp -I/usr/include/mariadb/mysql -L/usr/lib/mysql -lmariadb -lmysqlcppconn -lmysqlclient_r -pthread
Re: веб-сервер
Добавлено: 23 авг 2024, 12:29
ya
Исправлен обработчик куков, добавлен трай-кетч для обработки вводимых данных при создании виртуалки
Код: Выделить всё
g++ -std=c++11 -o webs5 webs5.cpp -I/usr/include/mariadb/mysql -L/usr/lib/mysql -lmariadb -lmysqlcppconn -lmysqlclient_r -pthread
или для сборки с помощью
make добавить в проект
Makefile
Код: Выделить всё
# Имя выходного файла
TARGET = webs5
# Исходные файлы
SRCS = webs5.cpp
# Компилятор
CXX = g++
# Флаги компилятора
CXXFLAGS = -std=c++11 -O2 -Wall
# Пути к библиотекам и заголовочным файлам
INCLUDES = -I/usr/include/mariadb/mysql
LIBS = -L/usr/lib/mysql -lmariadb -lmysqlcppconn -lmysqlclient_r -pthread
# Правило по умолчанию. Собрать целевой файл.
all: $(TARGET)
# Правило компиляции целевого файла
$(TARGET): $(SRCS)
$(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ $(LIBS)
# Правило для очистки скомпилированных файлов
clean:
rm -f $(TARGET)
# Правило для удобного вызова
.PHONY: all clean
Re: веб-сервер
Добавлено: 30 авг 2024, 18:29
ya
заменён протокол с http на https (бетта версия)
Для компиляции запустить скрипт