/
vipersteel
/
http-simple-service
Обзор
Документация
Войти
/
vipersteel
/
http-simple-service
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
http_server.cpp
99 строк
3 KB
vipersteel
Тестовый простой http-сервис для работы в Docker-контейнере
21 окт 2025, 12:30
21 окт 2025, 12:30
52d37ba
Код
Авторство
О чём код?
#include <iostream> #include <string> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> int main() { // Создаем сокет int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { std::cerr << "Ошибка создания сокета\n"; return 1; } // Разрешаем переиспользование адреса int opt = 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // Настраиваем адрес сервера struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8080); // Привязываем сокет к адресу if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { std::cerr << "Ошибка привязки\n"; close(server_fd); return 1; } // Начинаем слушать соединения if (listen(server_fd, 5) < 0) { std::cerr << "Ошибка прослушивания\n"; close(server_fd); return 1; } std::cout << "Сервер запущен на порту 8080...\n"; while (true) { // Принимаем соединение от клиента struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len); if (client_fd < 0) { std::cerr << "Ошибка принятия соединения\n"; continue; } // Читаем запрос от клиента char buffer[1024] = {0}; read(client_fd, buffer, sizeof(buffer) - 1); std::string request(buffer); // Определяем путь запроса std::string path = ""; if (request.find("GET /") != std::string::npos) { size_t start = request.find("GET /") + 4; size_t end = request.find(" ", start); if (end != std::string::npos) { path = request.substr(start, end - start); } } // Формируем ответ std::string response; if (path == "/api/v1/metrics") { // JSON ответ с строкой 'start-server' std::string json_body = "{\"message\": \"start-server\"}"; response = "HTTP/1.1 200 OK\r\n"; response += "Content-Type: application/json\r\n"; response += "Content-Length: " + std::to_string(json_body.length()) + "\r\n"; response += "Connection: close\r\n"; response += "\r\n"; response += json_body; } else { // 404 для всех остальных путей response = "HTTP/1.1 404 Not Found\r\n"; response += "Content-Type: text/plain\r\n"; response += "Content-Length: 9\r\n"; response += "Connection: close\r\n"; response += "\r\n"; response += "Not Found"; } // Отправляем ответ клиенту write(client_fd, response.c_str(), response.length()); // Закрываем соединение с клиентом close(client_fd); } // Закрываем серверный сокет (недостижимо в данном цикле) close(server_fd); return 0; }