From b20ce7c4de32b8cfd243bc354469f3eea5fe05f0 Mon Sep 17 00:00:00 2001 From: matv864 Date: Mon, 13 Jan 2025 04:58:58 +1000 Subject: [PATCH] base of API is created --- task_5/Makefile | 2 +- task_5/main.cpp | 28 +++----------------- task_5/routes.cpp | 37 +++++++++++++++++++++++++++ task_5/routes.h | 12 +++++++++ task_5/socket_handler.cpp | 54 +++++++++++++++++++++++++++++++++++++++ task_5/socket_handler.h | 19 ++++++++++++++ task_5/socket_up.cpp | 12 +++++---- task_5/socket_up.h | 6 +---- 8 files changed, 135 insertions(+), 35 deletions(-) create mode 100644 task_5/routes.cpp create mode 100644 task_5/routes.h diff --git a/task_5/Makefile b/task_5/Makefile index 43fe87f..d7de527 100644 --- a/task_5/Makefile +++ b/task_5/Makefile @@ -1,2 +1,2 @@ default_target: - g++ socket_up.cpp socket_handler.cpp main.cpp -o main -lws2_32 && main.exe \ No newline at end of file + g++ socket_up.cpp socket_handler.cpp routes.cpp main.cpp -o main -lws2_32 && main.exe \ No newline at end of file diff --git a/task_5/main.cpp b/task_5/main.cpp index 5dff931..6862c1c 100644 --- a/task_5/main.cpp +++ b/task_5/main.cpp @@ -3,34 +3,14 @@ #include + int main() { SOCKET listenSocket = SocketUp::config_socket_windows(); + SocketHandler::working_with_client_windows(listenSocket); - // 6. Принятие входящего соединения - sockaddr_in clientAddr; - int clientAddrSize = sizeof(clientAddr); - SOCKET clientSocket = accept(listenSocket, (struct sockaddr*)&clientAddr, &clientAddrSize); - if (clientSocket == INVALID_SOCKET) { - std::cerr << "Accept failed with error: " << WSAGetLastError() << "\n"; - closesocket(listenSocket); - WSACleanup(); - return 1; - } - std::cout << "Client connected!\n"; - - - // 7. Отправка данных клиенту - const char* message = "new message from server!\n"; - int bytesSent = send(clientSocket, message, strlen(message), 0); - if (bytesSent == SOCKET_ERROR) { - std::cerr << "Send failed with error: " << WSAGetLastError() << "\n"; - closesocket(clientSocket); - closesocket(listenSocket); - WSACleanup(); - return 1; - } - std::cout << "Message sent to client.\n"; + closesocket(listenSocket); + WSACleanup(); return 0; } \ No newline at end of file diff --git a/task_5/routes.cpp b/task_5/routes.cpp new file mode 100644 index 0000000..528ac28 --- /dev/null +++ b/task_5/routes.cpp @@ -0,0 +1,37 @@ +#include "routes.h" + + +std::string RouteHandler::get_response_by_request(const std::string& request) { + + + + + if (request.find("GET /current") != std::string::npos) { + return get_current_temperature(); + } + + return format_http_response("404 NOT FOUND", "404 Not Found"); +} + + + +std::string RouteHandler::get_current_temperature() { + std::string temperature_info = ( + "{\"temperature\": \"22°C\", \"weather\": \"good\"}" + ); + return format_http_response("200 OK", temperature_info); +} + + + + + +std::string RouteHandler::format_http_response(std::string status, std::string text) { + return ( + "HTTP/1.1 " + status + "\r\n" + "Content-Type: application/json\r\n" + "Content-Length: " + std::to_string(text.length()) + "\r\n" + "\r\n" + + text + ); +} \ No newline at end of file diff --git a/task_5/routes.h b/task_5/routes.h new file mode 100644 index 0000000..566c27a --- /dev/null +++ b/task_5/routes.h @@ -0,0 +1,12 @@ +#include + +class RouteHandler { +public: + static std::string get_response_by_request(const std::string& request); + +protected: + static std::string format_http_response(std::string status, std::string text); + +private: + static std::string get_current_temperature(); +}; \ No newline at end of file diff --git a/task_5/socket_handler.cpp b/task_5/socket_handler.cpp index e69de29..7ab241f 100644 --- a/task_5/socket_handler.cpp +++ b/task_5/socket_handler.cpp @@ -0,0 +1,54 @@ +#include "socket_handler.h" + +#include "routes.h" + + +const int BUFFER_SIZE = 4096; + + + +int SocketHandler::working_with_client_windows(SOCKET listenSocket) { + while (1) { + // 6. Принятие входящего соединения + sockaddr_in clientAddr; + int clientAddrSize = sizeof(clientAddr); + SOCKET clientSocket = accept(listenSocket, (struct sockaddr*)&clientAddr, &clientAddrSize); + if (clientSocket == INVALID_SOCKET) { + std::cerr << "Accept failed with error: " << WSAGetLastError() << "\n"; + continue; + } + std::cout << "Client connected!\n"; + + // 7. получение данных от юзера + char buffer[BUFFER_SIZE] = {0}; + int bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE, 0); + if (bytesReceived > 0) { + std::string request(buffer, bytesReceived); + std::cout << "Received request:\n" << request << "\n"; + + // Обработка запроса + std::string response = RouteHandler::get_response_by_request(request); + std::cout << "Response:\n" << response << "\n\n"; + + // Отправка ответа + send(clientSocket, response.c_str(), response.size(), 0); + } + closesocket(clientSocket); + } + return 0; +} + + + +int SocketHandler::working_with_client_unix() { + return 0; +} + + + + + + + + + diff --git a/task_5/socket_handler.h b/task_5/socket_handler.h index e69de29..2c35f1a 100644 --- a/task_5/socket_handler.h +++ b/task_5/socket_handler.h @@ -0,0 +1,19 @@ +#ifdef _WIN32 + #include + #include + #include + #include +#else + #include +#endif + + +#include + + +class SocketHandler { +public: + static int working_with_client_windows(SOCKET listenSocket); + static int working_with_client_unix(); +}; + diff --git a/task_5/socket_up.cpp b/task_5/socket_up.cpp index a9b50cf..c34db3e 100644 --- a/task_5/socket_up.cpp +++ b/task_5/socket_up.cpp @@ -49,15 +49,17 @@ SOCKET SocketUp::config_socket_windows() { return listenSocket; - - - // // 8. Закрытие клиентского сокета + // 8. Закрытие клиентского сокета // closesocket(clientSocket); // // 9. Закрытие серверного сокета и завершение Winsock // closesocket(listenSocket); // WSACleanup(); - - // std::cout << "Server shut down.\n"; + return 0; +} + + + +int SocketUp::config_socket_unix() { return 0; } diff --git a/task_5/socket_up.h b/task_5/socket_up.h index 0173e1c..fa90966 100644 --- a/task_5/socket_up.h +++ b/task_5/socket_up.h @@ -14,11 +14,7 @@ class SocketUp { public: - #ifdef _WIN32 static SOCKET config_socket_windows(); - #else - // SOCKET? - static SOCKET config_socket_unix(); - #endif + static int config_socket_unix(); };