From 92ac924f0aeb9bfa3eee8248906aa798de5b3908 Mon Sep 17 00:00:00 2001 From: bettercallous Date: Tue, 9 Apr 2024 20:18:56 +0000 Subject: [PATCH] handled reveiving data in several parts and rebuild it (data sent in parts using ctrl+D. e.g. : com^Dman^Dd) --- Server.cpp | 42 ++++++++++++++++++++++++++++++------------ Server.hpp | 1 + 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Server.cpp b/Server.cpp index 6cdaf4e..0973189 100644 --- a/Server.cpp +++ b/Server.cpp @@ -113,20 +113,37 @@ void Server::handleClientConnection() { } void Server::handleClientData(int fd) { - char buffer[BUFFER_SIZE] = {0}; - - // Receive the data - ssize_t bytes = recv(fd, buffer, BUFFER_SIZE - 1 , 0); - - // Check if the client disconnected - if (bytes <= 0) { + std::string command; + char buffer[BUFFER_SIZE]; + memset(buffer, 0, sizeof(buffer)); + + ssize_t bytesRead; + while ((bytesRead = recv(fd, buffer, BUFFER_SIZE - 1, 0)) > 0) { + bool foundEof = false; + for (ssize_t i = 0; i < bytesRead; ++i) { + if (buffer[i] == '\n') { + foundEof = true; + break; + } + } + + if (!foundEof) { + buffer[bytesRead] = '\0'; + command += buffer; + } else { + command.append(buffer, bytesRead - 1); + std::cout << "Received data from client " << fd << ": " << command << std::endl; + // process the command here + break; + } + } + + if (bytesRead == 0) { std::cout << "Client <" << fd << "> Disconnected" << std::endl; clientCleanup(fd); - } else { - buffer[bytes] = '\0'; - std::cout << "Client <" << fd << "> Data: " << buffer; - - // parse, check, and handle the received data here + } else if (bytesRead == -1) { + std::cerr << "Error reading data from client <" << fd << ">" << std::endl; + clientCleanup(fd); } } @@ -134,6 +151,7 @@ void Server::clientCleanup(int fd) { for (std::vector::iterator it = _fds.begin(); it != _fds.end(); ++it) { if (it->fd == fd) { _fds.erase(it); + close(fd); break; } } diff --git a/Server.hpp b/Server.hpp index b50acc5..2bc93d9 100644 --- a/Server.hpp +++ b/Server.hpp @@ -9,6 +9,7 @@ #include #include #include "Client.hpp" +#include #define BUFFER_SIZE 1024 class Server {