add broadcasting
This commit is contained in:
@@ -80,6 +80,7 @@ ErrorCode TcpClient::init() {
|
|||||||
// listen for receive from the server
|
// listen for receive from the server
|
||||||
memset(buffer, 0x00, sizeof(buffer));
|
memset(buffer, 0x00, sizeof(buffer));
|
||||||
receiveBytes = tcpRead(socketFd, buffer, sizeof(buffer)); // TODO: this currently blocks forever, add timeout
|
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
|
// we expect a response based on the server design, something went wrong otherwise
|
||||||
if(receiveBytes < 0) {
|
if(receiveBytes < 0) {
|
||||||
@@ -91,7 +92,8 @@ ErrorCode TcpClient::init() {
|
|||||||
return ErrorCode::Error;
|
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);
|
close(socketFd);
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ ssize_t TcpBase::tcpRead(int fd, void* buffer, size_t maxBytes) {
|
|||||||
}
|
}
|
||||||
return bytesReceived;
|
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) {
|
ssize_t TcpBase::tcpTimedRead(int fd, void* buffer, size_t maxBytes, int timeoutPlaceholder) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ ErrorCode TcpServer::init() {
|
|||||||
struct sockaddr_in clientAddress; // ip address of the client
|
struct sockaddr_in clientAddress; // ip address of the client
|
||||||
char clientIp[20];
|
char clientIp[20];
|
||||||
int clientPort;
|
int clientPort;
|
||||||
uint32_t clientCount = 0;
|
|
||||||
|
|
||||||
serverSocket = socket(AF_INET, SOCK_STREAM, 0); // create the server's endpoint
|
serverSocket = socket(AF_INET, SOCK_STREAM, 0); // create the server's endpoint
|
||||||
// AF_INET: address-family: internet (alias for IPV4, AF_INET6 for ipv6)
|
// AF_INET: address-family: internet (alias for IPV4, AF_INET6 for ipv6)
|
||||||
@@ -153,20 +152,9 @@ ErrorCode TcpServer::init() {
|
|||||||
sockets[i].fd = -1;
|
sockets[i].fd = -1;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// receive success, everything below is a simulated "processMessage()"
|
// receive success
|
||||||
std::string message(buffer, receiveBytes);
|
handleMessage(buffer, receiveBytes, 0, i);
|
||||||
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]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -177,3 +165,34 @@ ErrorCode TcpServer::init() {
|
|||||||
|
|
||||||
return ErrorCode::Success;
|
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];
|
struct pollfd sockets[kMaxClients + 1];
|
||||||
std::string clientAddresses[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