Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save ExtremeFine21/2ee80c0841e4a9b262f2087dbcab8a91 to your computer and use it in GitHub Desktop.

Select an option

Save ExtremeFine21/2ee80c0841e4a9b262f2087dbcab8a91 to your computer and use it in GitHub Desktop.
#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