From a400b233a2c345642708b3f5869fb4a74f594944 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sun, 19 Jul 2026 23:01:36 -0500 Subject: [PATCH] add broadcasting --- client/src/TcpClient.cpp | 4 +++- common/TcpBase.cpp | 3 ++- server/src/TcpServer.cpp | 49 ++++++++++++++++++++++++++++------------ server/src/TcpServer.hpp | 4 ++++ 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/client/src/TcpClient.cpp b/client/src/TcpClient.cpp index 467d47a..370cc0c 100644 --- a/client/src/TcpClient.cpp +++ b/client/src/TcpClient.cpp @@ -80,6 +80,7 @@ ErrorCode TcpClient::init() { // listen for receive from the server memset(buffer, 0x00, sizeof(buffer)); receiveBytes = tcpRead(socketFd, buffer, sizeof(buffer)); // TODO: this currently blocks forever, add timeout + // TODO: separate thread // we expect a response based on the server design, something went wrong otherwise if(receiveBytes < 0) { @@ -91,7 +92,8 @@ ErrorCode TcpClient::init() { return ErrorCode::Error; } - logger_->log("TcpClient", LogFlag::Debug, "Received {} bytes back from the server", receiveBytes); + std::string receivedMessage(buffer, receiveBytes); + logger_->log("TcpClient", LogFlag::Debug, "Received {} bytes back from the server: {}", receiveBytes, receivedMessage); } close(socketFd); diff --git a/common/TcpBase.cpp b/common/TcpBase.cpp index c38fd3c..9f76043 100644 --- a/common/TcpBase.cpp +++ b/common/TcpBase.cpp @@ -42,7 +42,8 @@ ssize_t TcpBase::tcpRead(int fd, void* buffer, size_t maxBytes) { } return bytesReceived; -} +} // TODO: tcp read should accept a header struct as an argument and write the header data into the struct +// can be as simple as a union with a char[8] if you want; ssize_t TcpBase::tcpTimedRead(int fd, void* buffer, size_t maxBytes, int timeoutPlaceholder) { return 0; diff --git a/server/src/TcpServer.cpp b/server/src/TcpServer.cpp index 8fdf4e4..7c01d61 100644 --- a/server/src/TcpServer.cpp +++ b/server/src/TcpServer.cpp @@ -36,7 +36,6 @@ ErrorCode TcpServer::init() { struct sockaddr_in clientAddress; // ip address of the client char clientIp[20]; int clientPort; - uint32_t clientCount = 0; serverSocket = socket(AF_INET, SOCK_STREAM, 0); // create the server's endpoint // AF_INET: address-family: internet (alias for IPV4, AF_INET6 for ipv6) @@ -153,20 +152,9 @@ ErrorCode TcpServer::init() { sockets[i].fd = -1; } else { - // receive success, everything below is a simulated "processMessage()" - std::string message(buffer, receiveBytes); - logger_->log("TcpClient", LogFlag::Debug, "Received {} bytes from client {}: {}", - receiveBytes, clientAddresses[i], message); - - // echo back received data back to the client - ssize_t sendBytes = tcpSend(sockets[i].fd, buffer, receiveBytes); - - if(sendBytes < 0) { - logger_->log("TcpServer", LogFlag::Error, "Unable to send to client."); - return ErrorCode::Error; - } - logger_->log("TcpClient", LogFlag::Debug, "Echoed {} bytes back to client {}", - sendBytes, clientAddresses[i]); + // receive success + handleMessage(buffer, receiveBytes, 0, i); + } } } @@ -177,3 +165,34 @@ ErrorCode TcpServer::init() { return ErrorCode::Success; } + +ErrorCode TcpServer::handleMessage(const char* message, size_t msgLength, uint32_t messageType, size_t socketId) { + + std::string messageString(message, msgLength); + logger_->log("TcpClient", LogFlag::Debug, "Received {} bytes from client {}: {}", + msgLength, clientAddresses[socketId], messageString); + + // broadcast to all clients + if(broadcastMessage(message, msgLength) != ErrorCode::Success) { + logger_->log("TcpServer", LogFlag::Error, "Broadcast failure."); + return ErrorCode::Error; + } + + return ErrorCode::Success; +} + +ErrorCode TcpServer::broadcastMessage(const char* message, size_t msgLength) { + + for(size_t i = 1; i < clientCount; i++) { + + ssize_t sendBytes = tcpSend(sockets[i].fd, message, msgLength); + if(sendBytes != msgLength) { + logger_->log("TcpServer", LogFlag::Error, "Unable to send to client {}", clientAddresses[i]); + return ErrorCode::Error; + } + } + + logger_->log("TcpClient", LogFlag::Debug, "Broadcasted {} bytes to {} clients", msgLength, clientCount); + + return ErrorCode::Success; +} \ No newline at end of file diff --git a/server/src/TcpServer.hpp b/server/src/TcpServer.hpp index 2815b8c..ebd4067 100644 --- a/server/src/TcpServer.hpp +++ b/server/src/TcpServer.hpp @@ -33,5 +33,9 @@ private: struct pollfd sockets[kMaxClients + 1]; std::string clientAddresses[kMaxClients + 1]; + uint32_t clientCount = 0; + + ErrorCode handleMessage(const char* message, size_t msgLength, uint32_t messageType, size_t socketId); + ErrorCode broadcastMessage(const char* message, size_t msgLength); };