Advertisement
ddto

Untitled

Aug 22nd, 2024
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 KB | None | 0 0
  1. // ------------- HEADER FILE ------------------
  2.  
  3. #pragma once
  4.  
  5. #include <cstdint>  
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <sys/socket.h>
  9. #include <sys/un.h>
  10. #include <cstring>
  11. #include <errno.h>
  12. #include <format>
  13. #include <string>
  14.  
  15. #include "Log.h"
  16.  
  17. #define CLIENT_SOCKET_PATH "test_program.client"
  18. #define SERVER_SOCKET_PATH "test_program.server"
  19. #define MSG_BUFFER_SIZE 256    
  20.  
  21. class Program
  22. {
  23. public:
  24.     void Init();
  25.     ~Program();
  26.  
  27. private:
  28.     void m_OpenSocket();
  29.     void m_Listen();
  30.     void m_Connect();
  31.  
  32.     void m_Process(const std::string& str);
  33.  
  34. private:
  35.     uint8_t m_clientNum = 1;
  36.  
  37.     struct sockaddr_un m_serverAddr;
  38.     struct sockaddr_un m_clientAddr;
  39.  
  40.     char m_buffer[MSG_BUFFER_SIZE] = {0};  
  41.     int m_serverSock = -1,
  42.         m_rc = -1,
  43.         m_len = -1,
  44.         m_clientFd = -1;
  45. };
  46.  
  47.  
  48. // ------------------ CPP FILE -------------------------
  49.  
  50. #include "Program.h"
  51.  
  52. void Program::Init()
  53. {
  54.     Log::GetInstance().Trace("Started server initialization");
  55.  
  56.     m_OpenSocket();
  57.     m_Listen();
  58.     m_Connect();
  59. }
  60.  
  61. void Program::m_OpenSocket()
  62. {
  63.     std::memset(&m_serverAddr, 0, sizeof(m_serverAddr));
  64.  
  65.     m_serverSock = socket(AF_UNIX, SOCK_STREAM, 0);
  66.     if(m_serverSock == -1) Log::GetInstance().Trace("Failed to open socket");
  67.     else Log::GetInstance().Trace("Opened server socket");
  68.  
  69.     m_serverAddr.sun_family = AF_UNIX;
  70.     strcpy(m_serverAddr.sun_path, SERVER_SOCKET_PATH);
  71.     m_len = sizeof(m_serverAddr);
  72.     unlink(SERVER_SOCKET_PATH);
  73.  
  74.     m_rc = bind(m_serverSock, (struct sockaddr*)&m_serverAddr, m_len);
  75.     if(m_rc == -1)
  76.     {
  77.         Log::GetInstance().Trace(std::format("Error binding server: {}", strerror(errno)));
  78.         close(m_serverSock);
  79.         exit(1);
  80.     }
  81.     Log::GetInstance().Trace("Bound server");
  82. }
  83.  
  84. void Program::m_Listen()
  85. {
  86.     m_rc = listen(m_serverSock, m_clientNum);
  87.     if(m_rc == -1)
  88.     {
  89.         Log::GetInstance().Trace(std::format("Server listening error: {}", strerror(errno)));
  90.         close(m_serverSock);
  91.         exit(1);
  92.     }
  93.     Log::GetInstance().Trace("Server started listening");
  94.  
  95. }
  96.  
  97. void Program::m_Connect()
  98. {
  99.     m_clientFd = accept(m_serverSock, (struct sockaddr *) &m_clientAddr, (socklen_t*)&m_len);
  100.     if(m_clientFd == -1)
  101.     {
  102.         Log::GetInstance().Trace(std::format("Client accept error: {}", strerror(errno)));
  103.         close(m_serverSock);
  104.         close(m_clientFd);
  105.         exit(1);
  106.     }
  107.     Log::GetInstance().Trace("Server connected to client");
  108.  
  109.     int byte_recv = recv(m_clientFd, m_buffer, sizeof(m_buffer), 0);
  110.     if (byte_recv == -1)
  111.     {
  112.         Log::GetInstance().Trace(std::format("Error recieving message from client: {}", strerror(errno)));
  113.         close(m_serverSock);
  114.         close(m_clientFd);
  115.         exit(1);
  116.     }
  117.     else
  118.     {
  119.         Log::GetInstance().Trace(std::format("Received from client: {}", std::string(m_buffer)));
  120.         m_Process(std::string(m_buffer));
  121.     }
  122. }
  123.  
  124. void Program::m_Process(const std::string& str)
  125. {
  126.     int sum = std::stoi(str);
  127.     if((str.size() > 2) && (sum % 32 == 0))
  128.     {
  129.         Log::GetInstance().Output(std::format("Received data from Program 1: {}", str));
  130.     }
  131.     else
  132.     {
  133.         Log::GetInstance().Output(std::format("Error: data received from Program 1 ({}) is incorrect", str));
  134.     }
  135. }
  136.  
  137. Program::~Program()
  138. {
  139.     close(m_serverSock);
  140.     close(m_clientFd);
  141.     remove(SERVER_SOCKET_PATH);
  142.     Log::GetInstance().Trace("Server closed");
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement