Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma warning(disable: 4996) // Отключение предупреждения о использовании устаревших функций Winsock
- #pragma comment(lib,"Ws2_32.lib")
- #include <winsock2.h>
- #include <stdio.h>
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <fstream>
- #include <locale>
- using namespace std;
- void insertServerInfo(char* text, const char* serverIP, int serverPort)
- {
- // Разбиение текста на предложения и добавление информации о сервере
- std::istringstream iss(text);
- std::ostringstream oss;
- std::string sentence;
- while (std::getline(iss, sentence, '.'))
- {
- oss << sentence << " Server IP: " << serverIP << ", Port: " << serverPort << '.';
- }
- std::string result = oss.str();
- // Копирование модифицированного текста обратно в исходный буфер
- if (result.length() < sizeof(text))
- {
- strcpy(text, result.c_str());
- }
- else
- {
- // Обработка случая, когда модифицированный текст превышает размер буфера
- // (Может потребоваться дополнительная логика или обработка ошибок)
- std::cerr << "Модифицированный текст превышает размер буфера. Обработайте этот случай соответственно." << std::endl;
- }
- }
- int main(void)
- {
- setlocale (LC_ALL, "Russian");
- WORD sockVer;
- WSADATA wsaData;
- int retVal;
- // Инициализация библиотеки Winsock
- sockVer = MAKEWORD(2, 2);
- WSAStartup(sockVer, &wsaData);
- // Создание сокета
- SOCKET servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (servSock == INVALID_SOCKET)
- {
- printf("Не удалось создать сокет\n");
- WSACleanup();
- system("pause");
- return SOCKET_ERROR;
- }
- SOCKADDR_IN sin;
- sin.sin_family = AF_INET;
- sin.sin_port = htons(2003);
- sin.sin_addr.s_addr = INADDR_ANY;
- // Привязка сокета к адресу
- retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));
- if (retVal == SOCKET_ERROR)
- {
- printf("Не удалось выполнить привязку\n");
- WSACleanup();
- system("pause");
- return SOCKET_ERROR;
- }
- printf("Сервер запущен на %s, порт %d\n", "192.168.0.13", htons(sin.sin_port));
- // функция inet_ntoa(sin.sin_addr) должна выводить IP сервера, но не делает этого
- // 192.168.0.13 - локальный IP сервера.
- while (true)
- {
- // Прослушивание сокета на предмет входящих соединений
- retVal = listen(servSock, 10);
- if (retVal == SOCKET_ERROR)
- {
- printf("Не удалось прослушать сокет\n");
- WSACleanup();
- system("pause");
- return SOCKET_ERROR;
- }
- SOCKET clientSock;
- SOCKADDR_IN from;
- int fromlen = sizeof(from);
- // Принятие входящего соединения
- clientSock = accept(servSock, (struct sockaddr*)&from, &fromlen);
- if (clientSock == INVALID_SOCKET)
- {
- printf("Не удалось принять соединение\n");
- WSACleanup();
- system("pause");
- return SOCKET_ERROR;
- }
- printf("Новое соединение от %s, порт %d\n", inet_ntoa(from.sin_addr), htons(from.sin_port));
- // Прием и обработка нескольких строк текста от клиента
- do
- {
- char szReq[512]; // Увеличен размер буфера для учета модификаций
- retVal = recv(clientSock, szReq, sizeof(szReq) - 1, 0);
- if (retVal == SOCKET_ERROR)
- {
- printf("Не удалось принять данные\n");
- system("pause");
- closesocket(clientSock);
- WSACleanup();
- return SOCKET_ERROR;
- }
- szReq[retVal] = '\0';
- printf("Данные приняты\n");
- // Вставка информации об IP и порте сервера в принятый текст
- insertServerInfo(szReq, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
- // Попытка отправить модифицированный текст клиенту
- printf("Отправка ответа от сервера\n");
- retVal = send(clientSock, szReq, strlen(szReq), 0);
- if (retVal == SOCKET_ERROR)
- {
- printf("Не удалось отправить\n");
- system("pause");
- closesocket(clientSock);
- WSACleanup();
- return SOCKET_ERROR;
- }
- // Запись модифицированного текста в файл output.txt
- std::ofstream outputFile("output.txt", std::ios::app);
- if (outputFile.is_open())
- {
- outputFile << szReq << std::endl;
- outputFile.close();
- }
- else
- {
- std::cerr << "Не удалось открыть файл для записи." << std::endl;
- }
- } while (retVal > 0);
- closesocket(clientSock);
- printf("Соединение закрыто\n");
- }
- // Закрытие сокета
- closesocket(servSock);
- WSACleanup();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement