diff --git a/.gitignore b/.gitignore index 567609b..4afeb8f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ +.idea/ build/ +cmake-build-debug/ +cmake-build-release/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5dc430e..d1580f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,21 +2,19 @@ cmake_minimum_required(VERSION 3.15...4.0) project(SimpleHttpServer VERSION 1.0 DESCRIPTION "A simple HTTP server written in C++" - LANGUAGES CXX) - - + LANGUAGES C) add_library( - httpserverlib - STATIC - src/server.hpp - src/server.cpp + httpserverlib + STATIC + src/httpserver.h + src/httpserver.c ) -target_compile_features(httpserverlib PUBLIC cxx_std_23) add_executable( - httpserver - app/main.cpp + httpserver + app/main.c + app/main.h ) target_link_libraries(httpserver PUBLIC httpserverlib) diff --git a/app/main.c b/app/main.c new file mode 100644 index 0000000..cb2a741 --- /dev/null +++ b/app/main.c @@ -0,0 +1,20 @@ +// +// Created by nazar on 12.09.2025. +// + +#include "main.h" +#include + +struct HttpResponse* handleRequest(struct HttpRequest* request) +{ + struct HttpResponse* http_response = {}; + return http_response; +} + +int main() { + struct HttpServer http_server; + printf("Starting the server...\n"); + start_http_server(&http_server, ADDRESS, PORT); + printf("Bye!\n"); + return 0; +} diff --git a/app/main.cpp b/app/main.cpp deleted file mode 100644 index c48624b..0000000 --- a/app/main.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include "../src/server.hpp" - -int main() { - SimpleHttpServer server; - server.start_listening(8080); - std::println("Bye!"); -} diff --git a/app/main.h b/app/main.h new file mode 100644 index 0000000..b3f11c7 --- /dev/null +++ b/app/main.h @@ -0,0 +1,16 @@ +// +// Created by nazar on 12.09.2025. +// + +#ifndef SIMPLEHTTPSERVER_MAIN_H +#define SIMPLEHTTPSERVER_MAIN_H + +#include "../src/httpserver.h" +#define ADDRESS "127.0.0.1" +#define PORT 8080 + +struct HttpResponse* handleRequest(struct HttpRequest* request); + +int main(); + +#endif //SIMPLEHTTPSERVER_MAIN_H \ No newline at end of file diff --git a/src/httpserver.c b/src/httpserver.c new file mode 100644 index 0000000..886c87e --- /dev/null +++ b/src/httpserver.c @@ -0,0 +1,66 @@ +// +// Created by nazar on 12.09.2025. +// + +#include "httpserver.h" +#include + +void start_http_server(struct HttpServer* http_server, const char *addr, const short port) +{ + const int server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd == -1) + { + printf("Failed to create new socket.\n"); + return; + } + + struct sockaddr_in address; + address.sin_family = AF_INET; + address.sin_addr.s_addr = inet_addr(addr); + address.sin_port = htons(port); + + const int bind_c = bind(server_fd, (struct sockaddr*)&address, sizeof(address)); + if (bind_c == -1) + { + printf("Failed to bind address.\n"); + return; + } + + const int listen_c = listen(server_fd, 3); + if (listen_c == -1) + { + printf("Failed to begin listening.\n"); + return; + } + + printf("Server is listening on %s:%d...\n", addr, port); + + size_t addr_len = sizeof(address); + process_conn(http_server, server_fd, (struct sockaddr*)&address, (socklen_t*)&addr_len); + + close(server_fd); +} + +void process_conn(struct HttpServer* http_server, const int server_fd, struct sockaddr* address, socklen_t* addr_len) +{ + const int socket_d = accept(server_fd, address, addr_len); + if (socket_d == -1) + { + printf("Failed to accept connection.\n"); + return; + } + + char buffer[1024] = {0}; + const ssize_t bytes_read = read(socket_d, buffer, 1024); + printf("Client message (%ld):\n", bytes_read); + for (int i = 0; i < bytes_read; i++) + { + if (buffer[i] == '\r') + continue; + putchar(buffer[i]); + } + putchar('\n'); + fflush(stdout); + + close(socket_d); +} diff --git a/src/httpserver.h b/src/httpserver.h new file mode 100644 index 0000000..46d59bd --- /dev/null +++ b/src/httpserver.h @@ -0,0 +1,36 @@ +// +// Created by nazar on 12.09.2025. +// +// https://datatracker.ietf.org/doc/html/rfc9112#name-message + +#ifndef SIMPLEHTTPSERVER_H +#define SIMPLEHTTPSERVER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +struct HttpRequest +{ + +}; + +struct HttpResponse +{ + +}; + +struct HttpServer +{ + struct HttpResponse* (*handleRequest)(struct HttpRequest* request); +}; + +void start_http_server(struct HttpServer* http_server, const char *addr, short port); +void process_conn(struct HttpServer* http_server, int server_fd, struct sockaddr* address, socklen_t* addr_len); + +#endif //SIMPLEHTTPSERVER_H \ No newline at end of file diff --git a/src/server.cpp b/src/server.cpp deleted file mode 100644 index 9e33d95..0000000 --- a/src/server.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "server.hpp" - -SimpleHttpServer::SimpleHttpServer() { -} - -SimpleHttpServer::~SimpleHttpServer() { -} - -void SimpleHttpServer::start_listening(int port) { - std::println("Starting server on port {0}...", port); - - int serverSocket = socket(AF_INET, SOCK_STREAM, 0); - - sockaddr_in serverAddress; - serverAddress.sin_family = AF_INET; - serverAddress.sin_port = htons(port); - serverAddress.sin_addr.s_addr = INADDR_ANY; - - bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)); - - listen(serverSocket, 5); - - std::println("Listening..."); - - int clientSocket = accept(serverSocket, nullptr, nullptr); - - char buffer[1024] = {0}; - recv(clientSocket, buffer, sizeof(buffer), 0); - std::println("Received: {0}", buffer); - - std::println("Closing..."); - - close(serverSocket); -} diff --git a/src/server.hpp b/src/server.hpp deleted file mode 100644 index a8be203..0000000 --- a/src/server.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class SimpleHttpServer { -public: - SimpleHttpServer(); - SimpleHttpServer(SimpleHttpServer &&) = default; - SimpleHttpServer(const SimpleHttpServer &) = default; - SimpleHttpServer &operator=(SimpleHttpServer &&) = default; - SimpleHttpServer &operator=(const SimpleHttpServer &) = default; - ~SimpleHttpServer(); - - void start_listening(int port); - -private: - -}; -