From 9ecc9ed9a79abb5887fb42e732a91abdad7f736e Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Fri, 28 Nov 2025 12:33:16 +0100 Subject: [PATCH] feat: now able to retrieve client ip, especially useful for logs --- httpd/src/server/server.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/httpd/src/server/server.c b/httpd/src/server/server.c index 6a50a5b..e772298 100644 --- a/httpd/src/server/server.c +++ b/httpd/src/server/server.c @@ -1,12 +1,12 @@ // === Definitions +#include #define _POSIX_C_SOURCE 200112L #define BUFFER_SIZE 1024 // === Includes -#include "server.h" - +#include #include #include #include @@ -15,6 +15,7 @@ #include "../http/http.h" #include "../logger/errors.h" +#include "server.h" // #include "../logger/logs.h" // === Static functions @@ -92,6 +93,15 @@ static int get_socket(const char *hostname, const char *port) // } // } +// Retrieves client ipv4 address and stores it in res +// WARNING: res must be of size INET_ADDRSTRLEN +static void get_ip(struct sockaddr *client_addr, char *res) +{ + // NOTE: exceptionally authorized cast + struct in_addr ipAddr = ((struct sockaddr_in *)client_addr)->sin_addr; + inet_ntop(AF_INET, &ipAddr, res, INET_ADDRSTRLEN); +} + // === Functions void start_server(const char *host, const char *port) @@ -108,13 +118,18 @@ void start_server(const char *host, const char *port) // Main loop while (1) { - int client_fd = accept(server_socket, NULL, NULL); + struct sockaddr client_addr; + int client_fd = accept(server_socket, &client_addr, NULL); if (client_fd == -1) continue; // TODO handle signals to stop - handle_request(client_fd, "127.0.0.1"); + // Get ip + char client_ip[INET_ADDRSTRLEN]; + get_ip(&client_addr, client_ip); + + handle_request(client_fd, client_ip); // send_back(client_fd); close(client_fd); }