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