Advertisement
VladimirKostovsky

Osi_2lab_server_windows

Dec 5th, 2023 (edited)
890
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.93 KB | None | 0 0
  1. #pragma warning(disable: 4996) // Отключение предупреждения о использовании устаревших функций Winsock
  2. #pragma comment(lib,"Ws2_32.lib")
  3. #include <winsock2.h>
  4. #include <stdio.h>
  5. #include <iostream>
  6. #include <sstream>
  7. #include <string>
  8. #include <fstream>
  9. #include <locale>
  10.  
  11. using namespace std;
  12.  
  13. void insertServerInfo(char* text, const char* serverIP, int serverPort)
  14. {
  15.     // Разбиение текста на предложения и добавление информации о сервере
  16.     std::istringstream iss(text);
  17.     std::ostringstream oss;
  18.  
  19.     std::string sentence;
  20.     while (std::getline(iss, sentence, '.'))
  21.     {
  22.         oss << sentence << " Server IP: " << serverIP << ", Port: " << serverPort << '.';
  23.     }
  24.  
  25.     std::string result = oss.str();
  26.  
  27.     // Копирование модифицированного текста обратно в исходный буфер
  28.     if (result.length() < sizeof(text))
  29.     {
  30.         strcpy(text, result.c_str());
  31.     }
  32.     else
  33.     {
  34.         // Обработка случая, когда модифицированный текст превышает размер буфера
  35.         // (Может потребоваться дополнительная логика или обработка ошибок)
  36.         std::cerr << "Модифицированный текст превышает размер буфера. Обработайте этот случай соответственно." << std::endl;
  37.     }
  38. }
  39.  
  40. int main(void)
  41. {
  42.     setlocale (LC_ALL, "Russian");
  43.     WORD sockVer;
  44.     WSADATA wsaData;
  45.     int retVal;
  46.  
  47.     // Инициализация библиотеки Winsock
  48.     sockVer = MAKEWORD(2, 2);
  49.     WSAStartup(sockVer, &wsaData);
  50.  
  51.     // Создание сокета
  52.     SOCKET servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  53.  
  54.     if (servSock == INVALID_SOCKET)
  55.     {
  56.         printf("Не удалось создать сокет\n");
  57.         WSACleanup();
  58.         system("pause");
  59.         return SOCKET_ERROR;
  60.     }
  61.  
  62.     SOCKADDR_IN sin;
  63.     sin.sin_family = AF_INET;
  64.     sin.sin_port = htons(2003);
  65.     sin.sin_addr.s_addr = INADDR_ANY;
  66.  
  67.     // Привязка сокета к адресу
  68.     retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));
  69.  
  70.     if (retVal == SOCKET_ERROR)
  71.     {
  72.         printf("Не удалось выполнить привязку\n");
  73.         WSACleanup();
  74.         system("pause");
  75.         return SOCKET_ERROR;
  76.     }
  77.  
  78.     printf("Сервер запущен на %s, порт %d\n", "192.168.0.13", htons(sin.sin_port));
  79. // функция inet_ntoa(sin.sin_addr) должна выводить IP сервера, но не делает этого
  80. // 192.168.0.13 - локальный IP сервера.
  81.     while (true)
  82.     {
  83.         // Прослушивание сокета на предмет входящих соединений
  84.         retVal = listen(servSock, 10);
  85.  
  86.         if (retVal == SOCKET_ERROR)
  87.         {
  88.             printf("Не удалось прослушать сокет\n");
  89.             WSACleanup();
  90.             system("pause");
  91.             return SOCKET_ERROR;
  92.         }
  93.  
  94.         SOCKET clientSock;
  95.         SOCKADDR_IN from;
  96.         int fromlen = sizeof(from);
  97.        
  98.         // Принятие входящего соединения
  99.         clientSock = accept(servSock, (struct sockaddr*)&from, &fromlen);
  100.  
  101.         if (clientSock == INVALID_SOCKET)
  102.         {
  103.             printf("Не удалось принять соединение\n");
  104.             WSACleanup();
  105.             system("pause");
  106.             return SOCKET_ERROR;
  107.         }
  108.  
  109.         printf("Новое соединение от %s, порт %d\n", inet_ntoa(from.sin_addr), htons(from.sin_port));
  110.  
  111.         // Прием и обработка нескольких строк текста от клиента
  112.         do
  113.         {
  114.             char szReq[512]; // Увеличен размер буфера для учета модификаций
  115.             retVal = recv(clientSock, szReq, sizeof(szReq) - 1, 0);
  116.  
  117.             if (retVal == SOCKET_ERROR)
  118.             {
  119.                 printf("Не удалось принять данные\n");
  120.                 system("pause");
  121.                 closesocket(clientSock);
  122.                 WSACleanup();
  123.                 return SOCKET_ERROR;
  124.             }
  125.  
  126.             szReq[retVal] = '\0';
  127.             printf("Данные приняты\n");
  128.  
  129.             // Вставка информации об IP и порте сервера в принятый текст
  130.             insertServerInfo(szReq, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
  131.  
  132.             // Попытка отправить модифицированный текст клиенту
  133.             printf("Отправка ответа от сервера\n");
  134.             retVal = send(clientSock, szReq, strlen(szReq), 0);
  135.  
  136.             if (retVal == SOCKET_ERROR)
  137.             {
  138.                 printf("Не удалось отправить\n");
  139.                 system("pause");
  140.                 closesocket(clientSock);
  141.                 WSACleanup();
  142.                 return SOCKET_ERROR;
  143.             }
  144.  
  145.             // Запись модифицированного текста в файл output.txt
  146.             std::ofstream outputFile("output.txt", std::ios::app);
  147.             if (outputFile.is_open())
  148.             {
  149.                 outputFile << szReq << std::endl;
  150.                 outputFile.close();
  151.             }
  152.             else
  153.             {
  154.                 std::cerr << "Не удалось открыть файл для записи." << std::endl;
  155.             }
  156.  
  157.         } while (retVal > 0);
  158.  
  159.         closesocket(clientSock);
  160.         printf("Соединение закрыто\n");
  161.     }
  162.  
  163.     // Закрытие сокета
  164.     closesocket(servSock);
  165.     WSACleanup();
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement