Created
February 15, 2026 09:35
-
-
Save ExtremeFine21/2ee80c0841e4a9b262f2087dbcab8a91 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| #include <thread> | |
| #include <cstring> | |
| #include <unistd.h> | |
| #include <arpa/inet.h> | |
| #include <ctime> | |
| #include <chrono> | |
| using namespace std; | |
| #define PORT 27015 | |
| #define BUFLEN 512 | |
| #define PAUSE_MS 500 // пауза, заменяет Sleep | |
| void sleepMs(int ms) { this_thread::sleep_for(chrono::milliseconds(ms)); } | |
| // Функция для текущего времени | |
| string getTimeNow() { | |
| time_t now = time(0); | |
| tm* local = localtime(&now); | |
| char buffer[6]; | |
| strftime(buffer, sizeof(buffer), "%H:%M", local); | |
| return string(buffer); | |
| } | |
| // --------------------- СЕРВЕР --------------------- | |
| void serverThread() { | |
| cout << "Процесс сервера запущено!\n"; | |
| sleepMs(PAUSE_MS); | |
| int server_fd = socket(AF_INET, SOCK_STREAM, 0); | |
| if (server_fd < 0) { cerr << "Ошибка создания сокета\n"; return; } | |
| cout << "Создание сокета прошло успешно!\n"; | |
| sleepMs(PAUSE_MS); | |
| sockaddr_in address{}; | |
| address.sin_family = AF_INET; | |
| address.sin_addr.s_addr = INADDR_ANY; | |
| address.sin_port = htons(PORT); | |
| if (bind(server_fd, (sockaddr*)&address, (socklen_t)sizeof(address)) < 0) { | |
| cerr << "bind не удалось\n"; return; | |
| } | |
| cout << "Привязка сокета к IP прошла успешно!\n"; | |
| sleepMs(PAUSE_MS); | |
| if (listen(server_fd, 3) < 0) { | |
| cerr << "listen не удалось\n"; return; | |
| } | |
| cout << "Сервер слушает клиентские подключения...\n"; | |
| socklen_t addrlen = sizeof(address); | |
| int client_sock = accept(server_fd, (sockaddr*)&address, &addrlen); | |
| if (client_sock < 0) { cerr << "accept не удалось\n"; return; } | |
| cout << "Подключение с клиентом установлено успешно!\n"; | |
| char message[BUFLEN]; | |
| while (true) { | |
| memset(message, 0, BUFLEN); | |
| int bytes_received = read(client_sock, message, BUFLEN); | |
| if (bytes_received <= 0) break; | |
| message[bytes_received] = '\0'; | |
| cout << "Клиент прислал сообщение: " << message << "\n"; | |
| sleepMs(PAUSE_MS); | |
| string response; | |
| string req(message); | |
| if (req == "як справи") response = "чудово"; | |
| else if (req == "котра година") response = getTimeNow(); | |
| else response = "не розумію запит"; | |
| cout << "Сервер отправляет ответ: " << response << "\n"; | |
| int sent = send(client_sock, response.c_str(), response.size(), 0); | |
| cout << "Байт отправлено: " << sent << "\n"; | |
| sleepMs(PAUSE_MS); | |
| } | |
| cout << "Клиент отключился. Сервер завершает работу.\n"; | |
| close(client_sock); | |
| close(server_fd); | |
| } | |
| // --------------------- КЛИЕНТ --------------------- | |
| void clientThread() { | |
| sleepMs(1000); // дать серверу подняться | |
| int sock = socket(AF_INET, SOCK_STREAM, 0); | |
| if (sock < 0) { cerr << "Ошибка создания сокета клиента\n"; return; } | |
| sockaddr_in serv_addr{}; | |
| serv_addr.sin_family = AF_INET; | |
| serv_addr.sin_port = htons(PORT); | |
| inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); | |
| if (connect(sock, (sockaddr*)&serv_addr, (socklen_t)sizeof(serv_addr)) != 0) { | |
| cerr << "Ошибка подключения к серверу\n"; | |
| close(sock); | |
| return; | |
| } | |
| cout << "Клиент подключен к серверу. Введите 'exit' для выхода.\n"; | |
| string input; | |
| char buffer[BUFLEN]; | |
| while (true) { | |
| cout << "> "; | |
| getline(cin, input); | |
| if (input == "exit") break; | |
| send(sock, input.c_str(), input.size(), 0); | |
| memset(buffer, 0, BUFLEN); | |
| int bytes_received = read(sock, buffer, BUFLEN); | |
| if (bytes_received <= 0) break; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment