This repository has been archived on 2025-06-01. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
compLIB/server/src/main.cpp
Konstantin Lampalzer 9b567b8c6c Protobuf prototype
2022-03-18 18:11:16 +01:00

90 lines
2.9 KiB
C++

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