add broadcasting
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user