Advertisement
ddto

Untitled

Aug 23rd, 2024
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. // HEADER
  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     // учитывая, что передается сумма, а не сама строка, 256 кажется достаточно объемным буфером
  20.  
  21. class Client
  22. {
  23. public:
  24.     void Init();
  25.     void Send(int sum);
  26.  
  27.     ~Client();
  28.  
  29. private:
  30.     struct sockaddr_un m_clientAddr;
  31.     struct sockaddr_un m_serverAddr;
  32.     int m_clientSock = -1,
  33.         m_len = -1,
  34.         m_rc = -1;
  35.     bool m_connected = false;
  36.     char m_buffer[MSG_BUFFER_SIZE] = {0};
  37. };
  38.  
  39.  
  40. // CPP FILE
  41.  
  42. #include "Client.h"
  43.  
  44. void Client::Init()
  45. {
  46.     Log::GetInstance().Trace("Begin client initialization");
  47.  
  48.     memset(&m_clientAddr, 0, sizeof(m_clientAddr));
  49.     m_clientSock = socket(AF_UNIX, SOCK_STREAM, 0);
  50.     if(m_clientSock == -1)
  51.     {
  52.         Log::GetInstance().Trace(std::format("Error opening client socket: {}", strerror(errno)));
  53.         return;
  54.     }
  55.     else Log::GetInstance().Trace("Opened client socket");
  56.  
  57.     m_clientAddr.sun_family = AF_UNIX;
  58.     strcpy(m_clientAddr.sun_path, CLIENT_SOCKET_PATH);
  59.     m_len = sizeof(m_clientAddr);
  60.     //unlink (CLIENT_SOCKET_PATH);
  61.  
  62.     m_rc = bind(m_clientSock, (struct sockaddr *)&m_clientAddr, m_len);
  63.     if(m_rc == -1)
  64.     {
  65.         Log::GetInstance().Trace(std::format("Error binding the client: {}", strerror(errno)));
  66.         close(m_clientSock);
  67.         return;
  68.     }
  69.     else Log::GetInstance().Trace("Bound client");
  70.  
  71.     m_serverAddr.sun_family = AF_UNIX;
  72.     strcpy(m_serverAddr.sun_path, SERVER_SOCKET_PATH);
  73.  
  74.     m_rc = connect(m_clientSock, (struct sockaddr*)&m_serverAddr, m_len);
  75.     if(m_rc == -1)
  76.     {
  77.         Log::GetInstance().Trace(std::format("Error connecting the client: {}. Path: {}", strerror(errno), std::string(m_serverAddr.sun_path)));
  78.         close(m_clientSock);
  79.         return;
  80.     }
  81.     else
  82.     {
  83.         m_connected = true;
  84.         Log::GetInstance().Trace("Connected client to the server");
  85.     }
  86. }
  87.  
  88. void Client::Send(int sum)
  89. {
  90.     if(!m_connected)
  91.     {
  92.         Log::GetInstance().Trace("Failed to send data: client is not connected");
  93.         return;
  94.     }
  95.  
  96.     memset(m_buffer, 0, sizeof(m_buffer));
  97.  
  98.     std::string sumStr = std::to_string(sum);
  99.     strcpy(m_buffer, sumStr.c_str());
  100.     m_rc = send(m_clientSock, m_buffer, sizeof(m_buffer), 0);
  101.     if(m_rc == -1)
  102.     {
  103.         Log::GetInstance().Trace(std::format("Error sending data from client: {}. fd: {}", strerror(errno), m_clientSock));
  104.         close(m_clientSock);
  105.         return;
  106.     }
  107.     Log::GetInstance().Trace(std::format("Client sent data ({}) to the server", sumStr));
  108. }
  109.  
  110. Client::~Client()
  111. {
  112.     close(m_clientSock);
  113.     remove(CLIENT_SOCKET_PATH);
  114. }
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement