Created
March 20, 2026 08:05
-
-
Save Vinnik67/cdd75e2869896b3ff736df08566cf623 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
| #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); | |
| } |
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
| #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