Protobuf prototype
This commit is contained in:
parent
e277a83c5f
commit
9b567b8c6c
119 changed files with 8599 additions and 0 deletions
90
server/src/main.cpp
Normal file
90
server/src/main.cpp
Normal file
|
@ -0,0 +1,90 @@
|
|||
#include <iostream>
|
||||
#include <CompLib.pb.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/socket.h>
|
||||
#include <zconf.h>
|
||||
#include "include/messageBuilder.hpp"
|
||||
#include "include/errorMessages.hpp"
|
||||
|
||||
#define SOCKET_PATH "/tmp/compLib"
|
||||
#define BUFFER_SIZE 64
|
||||
|
||||
google::protobuf::Message *processMessage(const std::string &serializedMessage) {
|
||||
CompLib::GenericRequest message;
|
||||
message.ParseFromString(serializedMessage);
|
||||
auto messageTypeName = message.header().message_type();
|
||||
|
||||
if (messageTypeName == CompLib::ReadSensorsRequest::GetDescriptor()->full_name()) {
|
||||
CompLib::ReadSensorsRequest readSensorsRequest;
|
||||
readSensorsRequest.ParseFromString(serializedMessage);
|
||||
} else if (messageTypeName == CompLib::ReadSensorsResponse::GetDescriptor()->full_name()) {
|
||||
CompLib::ReadSensorsResponse readSensorsResponse;
|
||||
readSensorsResponse.ParseFromString(serializedMessage);
|
||||
std::cout << readSensorsResponse.ir_1() << std::endl;
|
||||
std::cout << readSensorsResponse.ir_2() << std::endl;
|
||||
std::cout << readSensorsResponse.ir_3() << std::endl;
|
||||
std::cout << readSensorsResponse.ir_4() << std::endl;
|
||||
std::cout << readSensorsResponse.ir_5() << std::endl;
|
||||
} else {
|
||||
std::cout << messageTypeName << " not found!" << std::endl;
|
||||
}
|
||||
|
||||
google::protobuf::Message *returnMessage = MessageBuilder::genericResponse(false, ERROR_MESSAGE_UNKNOWN);
|
||||
return returnMessage;
|
||||
}
|
||||
|
||||
[[noreturn]] void socketServer() {
|
||||
struct sockaddr_un socketAddress;
|
||||
int socketFileDescriptor = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
remove(SOCKET_PATH);
|
||||
|
||||
memset(&socketAddress, 0, sizeof(struct sockaddr_un));
|
||||
socketAddress.sun_family = AF_UNIX;
|
||||
strncpy(socketAddress.sun_path, SOCKET_PATH, sizeof(socketAddress.sun_path) - 1);
|
||||
|
||||
if (bind(socketFileDescriptor, (struct sockaddr *) &socketAddress, sizeof(struct sockaddr_un)) == -1) {
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (listen(socketFileDescriptor, 1) == -1) {
|
||||
exit(-2);
|
||||
}
|
||||
|
||||
char readBuffer[BUFFER_SIZE];
|
||||
char writeBuffer[BUFFER_SIZE];
|
||||
for (;;) {
|
||||
int clientFileDescriptor = accept(socketFileDescriptor, NULL, NULL);
|
||||
auto numRead = read(clientFileDescriptor, readBuffer, 1);
|
||||
std::cout << numRead << std::endl;
|
||||
|
||||
uint8_t messageSize = readBuffer[0];
|
||||
std::cout << std::to_string(messageSize) << std::endl;
|
||||
|
||||
numRead = read(clientFileDescriptor, readBuffer, readBuffer[0]);
|
||||
std::cout << numRead << std::endl;
|
||||
|
||||
std::string stringMessage;
|
||||
for (int i{}; i < messageSize; i++) {
|
||||
stringMessage += readBuffer[i];
|
||||
}
|
||||
|
||||
auto response = processMessage(stringMessage);
|
||||
uint8_t responseSize = response->ByteSizeLong();
|
||||
writeBuffer[0] = responseSize;
|
||||
|
||||
std::cout << std::to_string(responseSize) << std::endl;
|
||||
write(clientFileDescriptor, writeBuffer, 1);
|
||||
|
||||
response->SerializeToArray(writeBuffer, BUFFER_SIZE);
|
||||
write(clientFileDescriptor, writeBuffer, responseSize);
|
||||
|
||||
close(clientFileDescriptor);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
socketServer();
|
||||
return 0;
|
||||
}
|
||||
|
Reference in a new issue