Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- constexpr const int DEFAULT_BUF_SIZE = 512;
- constexpr const int DEFAULT_PORT = 2003;
- // Функция для вставки информации об IP-адресе и порте сервера в конец каждого предложения
- void insertServerInfo(char* text, const char* serverIP, int serverPort)
- {
- // Проход по каждому предложению и добавление информации о сервере
- size_t pos = 0;
- while ((pos = std::string(text).find('.', pos)) != std::string::npos)
- {
- std::string insertText = " Server IP: " + std::string(serverIP) + ", Port: " + std::to_string(serverPort);
- // Копирование информации о сервере в текст после знака '.'
- memcpy(text + pos + 1, insertText.c_str(), insertText.length());
- pos += 2; // Перемещение за вставленный текст
- }
- }
- int main()
- {
- int serverSocket, clientSocket;
- struct sockaddr_in serverAddr, clientAddr;
- socklen_t clientAddrLen = sizeof(clientAddr);
- char recvbuf[DEFAULT_BUF_SIZE];
- char serverIP[INET_ADDRSTRLEN]; // Буфер для хранения IP-адреса сервера
- int serverPort = DEFAULT_PORT;
- // Создание сокета для сервера
- serverSocket = socket(AF_INET, SOCK_STREAM, 0);
- if (serverSocket == -1)
- {
- perror("socket");
- return 1;
- }
- // Настройка структуры адреса сервера
- memset(&serverAddr, 0, sizeof(serverAddr));
- serverAddr.sin_family = AF_INET;
- serverAddr.sin_addr.s_addr = INADDR_ANY;
- serverAddr.sin_port = htons(DEFAULT_PORT);
- // Привязка сокета
- if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1)
- {
- perror("bind");
- close(serverSocket);
- return 1;
- }
- std::cout << "Сервер слушает IP: " << inet_ntoa(serverAddr.sin_addr) << " Порт: " << ntohs(serverAddr.sin_port) << std::endl;
- // Ожидание подключения на сокете
- if (listen(serverSocket, SOMAXCONN) == -1)
- {
- perror("listen");
- close(serverSocket);
- return 1;
- }
- // Принятие соединения от клиента
- clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen);
- if (clientSocket == -1)
- {
- perror("accept");
- close(serverSocket);
- return 1;
- }
- // Получение информации о клиенте
- inet_ntop(AF_INET, &(clientAddr.sin_addr), serverIP, INET_ADDRSTRLEN);
- std::cout << "Принято соединение от клиента. IP клиента: " << serverIP << " Порт: " << ntohs(clientAddr.sin_port) << std::endl;
- // Получение данных от клиента
- ssize_t bytesRead = recv(clientSocket, recvbuf, sizeof(recvbuf) - 1, 0);
- if (bytesRead > 0)
- {
- recvbuf[bytesRead] = '\0';
- std::cout << "Получено от клиента: " << recvbuf;
- // Вставка информации об IP и порте сервера в принятый текст
- insertServerInfo(recvbuf, serverIP, serverPort);
- // Отправка модифицированного текста обратно клиенту
- ssize_t bytesSent = send(clientSocket, recvbuf, bytesRead, 0);
- if (bytesSent == -1)
- {
- perror("send");
- close(clientSocket);
- close(serverSocket);
- return 1;
- }
- std::cout << "Модифицированный текст отправлен обратно клиенту: " << recvbuf << std::endl;
- }
- else if (bytesRead == 0)
- {
- std::cout << "Соединение закрыто клиентом\n";
- }
- else
- {
- perror("recv");
- }
- // Завершение работы
- close(clientSocket);
- close(serverSocket);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement