Advertisement
VladimirKostovsky

Osi_lab2_server_ver3

Dec 4th, 2023 (edited)
977
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7. #include <arpa/inet.h>
  8.  
  9. constexpr const int DEFAULT_BUF_SIZE = 512;
  10. constexpr const int DEFAULT_PORT = 2003;
  11.  
  12. // Функция для вставки информации об IP-адресе и порте сервера в конец каждого предложения
  13. void insertServerInfo(char* text, const char* serverIP, int serverPort)
  14. {
  15.     // Проход по каждому предложению и добавление информации о сервере
  16.     size_t pos = 0;
  17.     while ((pos = std::string(text).find('.', pos)) != std::string::npos)
  18.     {
  19.         std::string insertText = " Server IP: " + std::string(serverIP) + ", Port: " + std::to_string(serverPort);
  20.         // Копирование информации о сервере в текст после знака '.'
  21.         memcpy(text + pos + 1, insertText.c_str(), insertText.length());
  22.         pos += 2; // Перемещение за вставленный текст
  23.     }
  24. }
  25.  
  26. int main()
  27. {
  28.     int serverSocket, clientSocket;
  29.     struct sockaddr_in serverAddr, clientAddr;
  30.     socklen_t clientAddrLen = sizeof(clientAddr);
  31.  
  32.     char recvbuf[DEFAULT_BUF_SIZE];
  33.     char serverIP[INET_ADDRSTRLEN]; // Буфер для хранения IP-адреса сервера
  34.     int serverPort = DEFAULT_PORT;
  35.  
  36.     // Создание сокета для сервера
  37.     serverSocket = socket(AF_INET, SOCK_STREAM, 0);
  38.     if (serverSocket == -1)
  39.     {
  40.         perror("socket");
  41.         return 1;
  42.     }
  43.  
  44.     // Настройка структуры адреса сервера
  45.     memset(&serverAddr, 0, sizeof(serverAddr));
  46.     serverAddr.sin_family = AF_INET;
  47.     serverAddr.sin_addr.s_addr = INADDR_ANY;
  48.     serverAddr.sin_port = htons(DEFAULT_PORT);
  49.  
  50.     // Привязка сокета
  51.     if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1)
  52.     {
  53.         perror("bind");
  54.         close(serverSocket);
  55.         return 1;
  56.     }
  57.  
  58.     std::cout << "Сервер слушает IP: " << inet_ntoa(serverAddr.sin_addr) << " Порт: " << ntohs(serverAddr.sin_port) << std::endl;
  59.  
  60.     // Ожидание подключения на сокете
  61.     if (listen(serverSocket, SOMAXCONN) == -1)
  62.     {
  63.         perror("listen");
  64.         close(serverSocket);
  65.         return 1;
  66.     }
  67.  
  68.     // Принятие соединения от клиента
  69.     clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen);
  70.     if (clientSocket == -1)
  71.     {
  72.         perror("accept");
  73.         close(serverSocket);
  74.         return 1;
  75.     }
  76.  
  77.     // Получение информации о клиенте
  78.     inet_ntop(AF_INET, &(clientAddr.sin_addr), serverIP, INET_ADDRSTRLEN);
  79.     std::cout << "Принято соединение от клиента. IP клиента: " << serverIP << " Порт: " << ntohs(clientAddr.sin_port) << std::endl;
  80.  
  81.     // Получение данных от клиента
  82.     ssize_t bytesRead = recv(clientSocket, recvbuf, sizeof(recvbuf) - 1, 0);
  83.     if (bytesRead > 0)
  84.     {
  85.         recvbuf[bytesRead] = '\0';
  86.         std::cout << "Получено от клиента: " << recvbuf;
  87.  
  88.         // Вставка информации об IP и порте сервера в принятый текст
  89.         insertServerInfo(recvbuf, serverIP, serverPort);
  90.  
  91.         // Отправка модифицированного текста обратно клиенту
  92.         ssize_t bytesSent = send(clientSocket, recvbuf, bytesRead, 0);
  93.         if (bytesSent == -1)
  94.         {
  95.             perror("send");
  96.             close(clientSocket);
  97.             close(serverSocket);
  98.             return 1;
  99.         }
  100.         std::cout << "Модифицированный текст отправлен обратно клиенту: " << recvbuf << std::endl;
  101.     }
  102.     else if (bytesRead == 0)
  103.     {
  104.         std::cout << "Соединение закрыто клиентом\n";
  105.     }
  106.     else
  107.     {
  108.         perror("recv");
  109.     }
  110.  
  111.     // Завершение работы
  112.     close(clientSocket);
  113.     close(serverSocket);
  114.  
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement