Skip to content

Instantly share code, notes, and snippets.

@Vinnik67
Created March 20, 2026 08:05
Show Gist options
  • Select an option

  • Save Vinnik67/cdd75e2869896b3ff736df08566cf623 to your computer and use it in GitHub Desktop.

Select an option

Save Vinnik67/cdd75e2869896b3ff736df08566cf623 to your computer and use it in GitHub Desktop.
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma execution_character_set("utf-8")
#include <ws2tcpip.h>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
#pragma comment (lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 4096
#define SERVER_IP "127.0.0.1"
#define DEFAULT_PORT "8888"
SOCKET client_socket;
wstring login;
DWORD WINAPI Sender(void* param) {
while (true) {
wstring message;
getline(wcin, message);
// формируем строку "login: текст"
wstring formatted = login + L": " + message;
string utf8(formatted.begin(), formatted.end()); // простая конвертация
send(client_socket, utf8.c_str(), (int)utf8.size(), 0);
}
}
DWORD WINAPI Receiver(void* param) {
char response[DEFAULT_BUFLEN];
while (true) {
int result = recv(client_socket, response, DEFAULT_BUFLEN, 0);
if (result <= 0) break;
response[result] = '\0';
wcout << L"Відповідь від сервера: " << response << endl;
}
return 0;
}
int main() {
system("title Клієнт");
// ввод логина и пароля
wstring password;
wcout << L"Введіть логін: ";
getline(wcin, login);
wcout << L"Введіть пароль: ";
getline(wcin, password);
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
wcout << L"WSAStartup error\n";
return 1;
}
addrinfo hints{}, * result = nullptr;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
if (getaddrinfo(SERVER_IP, DEFAULT_PORT, &hints, &result) != 0) {
wcout << L"getaddrinfo error\n";
WSACleanup();
return 2;
}
client_socket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (connect(client_socket, result->ai_addr, (int)result->ai_addrlen) == SOCKET_ERROR) {
wcout << L"Connect error\n";
WSACleanup();
return 3;
}
freeaddrinfo(result);
// отправляем логин+пароль серверу
wstring credentials = login + L";" + password;
string utf8(credentials.begin(), credentials.end());
send(client_socket, utf8.c_str(), (int)utf8.size(), 0);
system("cls");
wcout << L"Авторизація успішна! Тепер можна писати повідомлення.\n";
CreateThread(0, 0, Sender, 0, 0, 0);
CreateThread(0, 0, Receiver, 0, 0, 0);
Sleep(INFINITE);
}
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma execution_character_set("utf-8")
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define MAX_CLIENTS 20
#define DEFAULT_BUFLEN 4096
struct ClientInfo {
string login;
string password;
string ip;
int port;
};
SOCKET server_socket;
SOCKET client_socket[MAX_CLIENTS]{};
vector<ClientInfo> registeredClients;
vector<string> history;
int main() {
setlocale(LC_ALL, "");
system("title Сервер");
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
wcout << L"Помилка WSAStartup\n";
return 1;
}
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == INVALID_SOCKET) {
wcout << L"Не вдалося створити сокет\n";
return 2;
}
sockaddr_in server{};
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
if (bind(server_socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
wcout << L"Помилка прив'язки сокета\n";
return 3;
}
listen(server_socket, MAX_CLIENTS);
wcout << L"Сервер запущено. Очікування клієнтів...\n";
fd_set readfds;
sockaddr_in address;
int addrlen = sizeof(sockaddr_in);
while (true) {
FD_ZERO(&readfds);
FD_SET(server_socket, &readfds);
for (int i = 0; i < MAX_CLIENTS; i++)
if (client_socket[i] > 0) FD_SET(client_socket[i], &readfds);
if (select(0, &readfds, NULL, NULL, NULL) == SOCKET_ERROR) {
wcout << L"Помилка select\n";
break;
}
if (FD_ISSET(server_socket, &readfds)) {
SOCKET new_socket = accept(server_socket, (sockaddr*)&address, &addrlen);
char buffer[DEFAULT_BUFLEN];
int len = recv(new_socket, buffer, DEFAULT_BUFLEN, 0);
if (len <= 0) continue;
buffer[len] = '\0';
string credentials(buffer);
size_t sep = credentials.find(';');
string login = credentials.substr(0, sep);
string password = credentials.substr(sep + 1);
auto it = find_if(registeredClients.begin(), registeredClients.end(),
[&](const ClientInfo& c) { return c.login == login && c.password == password; });
if (it == registeredClients.end()) {
registeredClients.push_back({ login, password, inet_ntoa(address.sin_addr), ntohs(address.sin_port) });
wcout << L"Новий клієнт зареєстрований: " << login.c_str() << endl;
}
else {
wcout << L"Клієнт " << login.c_str() << L" увійшов." << endl;
}
for (int i = 0; i < MAX_CLIENTS; i++) {
if (client_socket[i] == 0) {
client_socket[i] = new_socket;
break;
}
}
}
for (int i = 0; i < MAX_CLIENTS; i++) {
SOCKET s = client_socket[i];
if (FD_ISSET(s, &readfds)) {
char msg[DEFAULT_BUFLEN];
int len = recv(s, msg, DEFAULT_BUFLEN, 0);
if (len <= 0) {
client_socket[i] = 0;
continue;
}
msg[len] = '\0';
string message(msg);
history.push_back(message + "\n");
wcout << L"Отримано: " << message.c_str() << endl;
for (int j = 0; j < MAX_CLIENTS; j++)
if (client_socket[j] != 0 && client_socket[j] != s)
send(client_socket[j], msg, len, 0);
}
}
}
WSACleanup();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment