Created
February 26, 2026 07:16
-
-
Save sunmeat/b669875856e6c9a0c42b8972750b57ae 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 WIN32_LEAN_AND_MEAN | |
| #include <iostream> | |
| #include <windows.h> | |
| #include <ws2tcpip.h> | |
| using namespace std; | |
| #pragma comment (lib, "Ws2_32.lib") | |
| #pragma comment (lib, "Mswsock.lib") | |
| #pragma comment (lib, "AdvApi32.lib") | |
| int main() { | |
| system("title CLIENT SIDE"); | |
| WSADATA wsaData; | |
| WSAStartup(MAKEWORD(2, 2), &wsaData); | |
| addrinfo hints{}; | |
| hints.ai_socktype = SOCK_STREAM; | |
| hints.ai_protocol = IPPROTO_TCP; | |
| string server_ip = "localhost"; // за замовчуванням, обидва додатки, і клієнт, і сервер, працюють на одній і тій самій машині | |
| addrinfo* result = 0; | |
| getaddrinfo(server_ip.c_str(), "27015", &hints, &result); | |
| SOCKET ServerSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); | |
| freeaddrinfo(result); | |
| connect(ServerSocket, result->ai_addr, (int)result->ai_addrlen); | |
| if (ServerSocket == -1) { | |
| cout << "неможливо пiдключитися до сервера. перевiрте, чи запущено процес сервера!\n"; | |
| WSACleanup(); | |
| return 14; | |
| } | |
| else { | |
| cout << "пiдключення до сервера пройшло успiшно!\n"; | |
| } | |
| while (true) { | |
| // request - запит від клієнта | |
| string request = "hello from client!"; | |
| send(ServerSocket, request.c_str(), request.size(), 0); | |
| // отримання даних до закриття з'єднання зі сторони сервера | |
| char response[512]; | |
| int bytes = recv(ServerSocket, response, 512, 0); | |
| response[bytes] = 0; | |
| if (bytes > 0) { | |
| cout << "SERVER RESPONSE: " << response << "\n"; | |
| } | |
| else if (bytes == 0) { | |
| cout << "з'єднання з сервером закрито.\n"; | |
| break; | |
| } | |
| } | |
| } |
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 <ws2tcpip.h> // тип WSADATA, функції WSAStartup, WSACleanup та багато чого іншого | |
| using namespace std; | |
| #pragma comment (lib, "Ws2_32.lib") | |
| int main() { | |
| system("title SERVER SIDE"); | |
| WSADATA wsaData; | |
| WSAStartup(MAKEWORD(2, 2), &wsaData); | |
| addrinfo hints {}; // структура addrinfo використовується функцією getaddrinfo для зберігання інформації про адресу хоста: https://docs.microsoft.com/en-us/windows/win32/api/ws2def/ns-ws2def-addrinfoa | |
| hints.ai_family = AF_INET; // адреса сімейства протоколу Інтернету версії 4 (IPv4) | |
| hints.ai_socktype = SOCK_STREAM; // забезпечує послідовні, надійні, двосторонні, засновані на з'єднанні потоки байтів з механізмом передачі даних | |
| hints.ai_protocol = IPPROTO_TCP; // протокол передачі управління (TCP). Це можливе значення, коли член ai_family є AF_INET або AF_INET6, а член ai_socktype — SOCK_STREAM | |
| hints.ai_flags = AI_PASSIVE; // адреса сокета буде використовуватися в виклику функції "bind" | |
| addrinfo* result = NULL; | |
| getaddrinfo(NULL, "27015", &hints, &result); | |
| // 1 | |
| SOCKET ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); | |
| // 2 | |
| bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); // Функція bind асоціює локальну адресу з сокетом: https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-bind | |
| // 3 | |
| listen(ListenSocket, SOMAXCONN); // функція listen ставить сокет у стан, коли він чекає вхідне підключення: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen | |
| // 4 | |
| SOCKET ClientSocket = accept(ListenSocket, 0, 0); // Функція accept дозволяє прийняти вхідне підключення на сокет: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept | |
| /////////////////////////// | |
| while (true) { | |
| char message[512]{}; | |
| int bytes = recv(ClientSocket, message, 512, 0); // функція recv використовується для читання вхідних даних: https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recv | |
| message[bytes] = 0; | |
| if (bytes > 0) { | |
| cout << "CLIENT MESSAGE: " << message << "\n"; | |
| // обробка отриманого повідомлення, якщо потрібно | |
| string answer = "hello from server!"; | |
| int answer_bytes = send(ClientSocket, answer.c_str(), answer.size(), 0); // функція send відправляє дані на підключений сокет: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-send | |
| // string >>> const char* | |
| } | |
| else if (bytes == 0) { | |
| cout << "з'єднання закривається...\n"; | |
| break; | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment