Страница 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

для компиляции:

Код: Выделить всё

g++ -std=c++11 -o webs5 webs5.cpp

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 (бетта версия)

Код: Выделить всё

sudo apt install libssl-dev
Для компиляции запустить скрипт

Код: Выделить всё

/bin/bash webs5.sh