Advertisement
ddto

Untitled

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