handled reveiving data in several parts and rebuild it (data sent in parts using ctrl+D. e.g. : com^Dman^Dd)

This commit is contained in:
bettercallous
2024-04-09 20:18:56 +00:00
parent 454e32f590
commit 92ac924f0a
2 changed files with 31 additions and 12 deletions

View File

@@ -113,20 +113,37 @@ void Server::handleClientConnection() {
} }
void Server::handleClientData(int fd) { void Server::handleClientData(int fd) {
char buffer[BUFFER_SIZE] = {0}; std::string command;
char buffer[BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
// Receive the data ssize_t bytesRead;
ssize_t bytes = recv(fd, buffer, BUFFER_SIZE - 1 , 0); 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;
}
}
// Check if the client disconnected if (!foundEof) {
if (bytes <= 0) { 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; std::cout << "Client <" << fd << "> Disconnected" << std::endl;
clientCleanup(fd); clientCleanup(fd);
} else { } else if (bytesRead == -1) {
buffer[bytes] = '\0'; std::cerr << "Error reading data from client <" << fd << ">" << std::endl;
std::cout << "Client <" << fd << "> Data: " << buffer; clientCleanup(fd);
// parse, check, and handle the received data here
} }
} }
@@ -134,6 +151,7 @@ void Server::clientCleanup(int fd) {
for (std::vector<pollfd>::iterator it = _fds.begin(); it != _fds.end(); ++it) { for (std::vector<pollfd>::iterator it = _fds.begin(); it != _fds.end(); ++it) {
if (it->fd == fd) { if (it->fd == fd) {
_fds.erase(it); _fds.erase(it);
close(fd);
break; break;
} }
} }

View File

@@ -9,6 +9,7 @@
#include <vector> #include <vector>
#include <poll.h> #include <poll.h>
#include "Client.hpp" #include "Client.hpp"
#include <cstring>
#define BUFFER_SIZE 1024 #define BUFFER_SIZE 1024
class Server { class Server {