add broadcasting

This commit is contained in:
2026-07-19 23:01:36 -05:00
parent 799521f51f
commit a400b233a2
4 changed files with 43 additions and 17 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);
};