/
konstvn.in
/
study-practice
Обзор
Документация
Войти
/
konstvn.in
/
study-practice
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main.cpp
121 строка
4 KB
konstvn.in
Финальная кроссплатформенная версия сервера
25 май 2026, 05:18
25 май 2026, 05:18
dace45e
Код
Авторство
О чём код?
#include <iostream> #include <string> #include <fstream> #include <sstream> #ifdef _WIN32 #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "Ws2_32.lib") typedef int socklen_t; #else #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> typedef int SOCKET; const int INVALID_SOCKET = -1; const int SOCKET_ERROR = -1; #define closesocket close #endif const int PORT = 8080; void update_visit_count() { int visits = 0; std::ifstream infile("stats.txt"); if (infile.is_open()) { infile >> visits; infile.close(); } visits++; std::ofstream outfile("stats.txt"); if (outfile.is_open()) { outfile << visits; outfile.close(); } std::cout << "[����������] ����� ���������� �����: " << visits << std::endl; } void send_response(SOCKET client_socket, int status_code, const std::string& status_text, const std::string& content) { std::ostringstream response; response << "HTTP/1.1 " << status_code << " " << status_text << "\r\n" << "Content-Type: text/html; charset=utf-8\r\n" << "Content-Length: " << content.length() << "\r\n" << "Connection: close\r\n\r\n" << content; std::string response_str = response.str(); send(client_socket, response_str.c_str(), (int)response_str.length(), 0); } int main() { #ifdef _WIN32 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "������ Winsock" << std::endl; return 1; } #endif SOCKET server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == INVALID_SOCKET) { std::cerr << "������ �������� ������" << std::endl; return 1; } #ifndef _WIN32 int opt = 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); #endif sockaddr_in address; 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)) == SOCKET_ERROR) { std::cerr << "������ �������� ������" << std::endl; closesocket(server_fd); return 1; } if (listen(server_fd, 3) == SOCKET_ERROR) { std::cerr << "������ �������������" << std::endl; closesocket(server_fd); return 1; } std::cout << "������������� server ������� �� http://127.0.0.1:" << PORT << std::endl; while (true) { socklen_t addrlen = sizeof(address); SOCKET client_socket = accept(server_fd, (struct sockaddr*)&address, &addrlen); if (client_socket == INVALID_SOCKET) continue; char buffer[1024] = {0}; #ifdef _WIN32 recv(client_socket, buffer, 1024, 0); #else read(client_socket, buffer, 1024); #endif std::string request(buffer); if (!request.empty()) { std::cout << "\n[���] ������� ������:\n" << request.substr(0, request.find("\n")) << std::endl; if (request.find("GET / ") != std::string::npos || request.find("GET /index.html") != std::string::npos) { update_visit_count(); std::ifstream html_file("site/index.html"); if (html_file.is_open()) { std::stringstream ss; ss << html_file.rdbuf(); send_response(client_socket, 200, "OK", ss.str()); html_file.close(); } else { send_response(client_socket, 200, "OK", "<h1>C++ Server is running! But index.html was not found in site/ folder.</h1>"); } } else { send_response(client_socket, 404, "Not Found", "<h1>404 �������� �� �������</h1>"); } } closesocket(client_socket); } closesocket(server_fd); #ifdef _WIN32 WSACleanup(); #endif return 0; }