Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ------------- HEADER FILE ------------------
- #pragma once
- #include <cstdint>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <cstring>
- #include <errno.h>
- #include <format>
- #include <string>
- #include "Log.h"
- #define CLIENT_SOCKET_PATH "test_program.client"
- #define SERVER_SOCKET_PATH "test_program.server"
- #define MSG_BUFFER_SIZE 256
- class Program
- {
- public:
- void Init();
- ~Program();
- private:
- void m_OpenSocket();
- void m_Listen();
- void m_Connect();
- void m_Process(const std::string& str);
- private:
- uint8_t m_clientNum = 1;
- struct sockaddr_un m_serverAddr;
- struct sockaddr_un m_clientAddr;
- char m_buffer[MSG_BUFFER_SIZE] = {0};
- int m_serverSock = -1,
- m_rc = -1,
- m_len = -1,
- m_clientFd = -1;
- };
- // ------------------ CPP FILE -------------------------
- #include "Program.h"
- void Program::Init()
- {
- Log::GetInstance().Trace("Started server initialization");
- m_OpenSocket();
- m_Listen();
- m_Connect();
- }
- void Program::m_OpenSocket()
- {
- std::memset(&m_serverAddr, 0, sizeof(m_serverAddr));
- m_serverSock = socket(AF_UNIX, SOCK_STREAM, 0);
- if(m_serverSock == -1) Log::GetInstance().Trace("Failed to open socket");
- else Log::GetInstance().Trace("Opened server socket");
- m_serverAddr.sun_family = AF_UNIX;
- strcpy(m_serverAddr.sun_path, SERVER_SOCKET_PATH);
- m_len = sizeof(m_serverAddr);
- unlink(SERVER_SOCKET_PATH);
- m_rc = bind(m_serverSock, (struct sockaddr*)&m_serverAddr, m_len);
- if(m_rc == -1)
- {
- Log::GetInstance().Trace(std::format("Error binding server: {}", strerror(errno)));
- close(m_serverSock);
- exit(1);
- }
- Log::GetInstance().Trace("Bound server");
- }
- void Program::m_Listen()
- {
- m_rc = listen(m_serverSock, m_clientNum);
- if(m_rc == -1)
- {
- Log::GetInstance().Trace(std::format("Server listening error: {}", strerror(errno)));
- close(m_serverSock);
- exit(1);
- }
- Log::GetInstance().Trace("Server started listening");
- }
- void Program::m_Connect()
- {
- m_clientFd = accept(m_serverSock, (struct sockaddr *) &m_clientAddr, (socklen_t*)&m_len);
- if(m_clientFd == -1)
- {
- Log::GetInstance().Trace(std::format("Client accept error: {}", strerror(errno)));
- close(m_serverSock);
- close(m_clientFd);
- exit(1);
- }
- Log::GetInstance().Trace("Server connected to client");
- int byte_recv = recv(m_clientFd, m_buffer, sizeof(m_buffer), 0);
- if (byte_recv == -1)
- {
- Log::GetInstance().Trace(std::format("Error recieving message from client: {}", strerror(errno)));
- close(m_serverSock);
- close(m_clientFd);
- exit(1);
- }
- else
- {
- Log::GetInstance().Trace(std::format("Received from client: {}", std::string(m_buffer)));
- m_Process(std::string(m_buffer));
- }
- }
- void Program::m_Process(const std::string& str)
- {
- int sum = std::stoi(str);
- if((str.size() > 2) && (sum % 32 == 0))
- {
- Log::GetInstance().Output(std::format("Received data from Program 1: {}", str));
- }
- else
- {
- Log::GetInstance().Output(std::format("Error: data received from Program 1 ({}) is incorrect", str));
- }
- }
- Program::~Program()
- {
- close(m_serverSock);
- close(m_clientFd);
- remove(SERVER_SOCKET_PATH);
- Log::GetInstance().Trace("Server closed");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement