Created
April 7, 2026 15:57
-
-
Save sunmeat/385bdced42838ae7dca19eee77c2ab3c to your computer and use it in GitHub Desktop.
приклад на парі 07.04.2026
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 <ws2tcpip.h> | |
| using namespace std; | |
| #pragma comment (lib, "Ws2_32.lib") | |
| #pragma comment (lib, "Mswsock.lib") // AcceptEx(), ConnectEx(), WSASendMsg() тощо | |
| #pragma comment (lib, "AdvApi32.lib") // Security API, Registry API, Service Control Manager тощо | |
| #define DEFAULT_BUFLEN 512 | |
| #define DEFAULT_PORT "27015" | |
| #define PAUSE 1 | |
| int main() | |
| { | |
| system("title КЛІЄНТСЬКА СТОРОНА"); | |
| cout << "процес клієнта запущено!\n"; | |
| Sleep(PAUSE); | |
| WSADATA wsaData; | |
| int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); | |
| if (iResult != 0) { | |
| cout << "WSAStartup не вдалося з помилкою: " << iResult << "\n"; | |
| return 11; | |
| } | |
| else { | |
| cout << "підключення до Winsock.dll пройшло успішно!\n"; | |
| Sleep(PAUSE); | |
| } | |
| addrinfo hints{}; | |
| hints.ai_family = AF_UNSPEC; | |
| hints.ai_socktype = SOCK_STREAM; | |
| hints.ai_protocol = IPPROTO_TCP; | |
| const char* ip = "localhost"; // за замовчуванням, обидва додатки, і клієнт, і сервер, працюють на одній і тій же машині | |
| addrinfo* result = NULL; | |
| iResult = getaddrinfo(ip, DEFAULT_PORT, &hints, &result); | |
| if (iResult != 0) { | |
| cout << "getaddrinfo не вдалося з помилкою: " << iResult << "\n"; | |
| WSACleanup(); | |
| return 12; | |
| } | |
| else { | |
| cout << "отримання адреси та порту клієнта пройшло успішно!\n"; | |
| Sleep(PAUSE); | |
| } | |
| SOCKET ConnectSocket = INVALID_SOCKET; | |
| for (addrinfo* ptr = result; ptr != NULL; ptr = ptr->ai_next) { // серверів може бути кілька, тому потрібен цикл | |
| ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); | |
| if (ConnectSocket == INVALID_SOCKET) { | |
| cout << "сокет не вдалося створити з помилкою: " << WSAGetLastError() << "\n"; | |
| WSACleanup(); | |
| return 13; | |
| } | |
| iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); | |
| if (iResult == SOCKET_ERROR) { | |
| closesocket(ConnectSocket); | |
| ConnectSocket = INVALID_SOCKET; | |
| continue; | |
| } | |
| cout << "створення сокета на клієнті пройшло успішно!\n"; | |
| Sleep(PAUSE); | |
| break; | |
| } | |
| freeaddrinfo(result); | |
| while (true) { | |
| string message = "привіт від клієнта!"; | |
| iResult = send(ConnectSocket, message.c_str(), message.size(), 0); | |
| Sleep(2000); | |
| char answer[DEFAULT_BUFLEN]; | |
| iResult = recv(ConnectSocket, answer, DEFAULT_BUFLEN, 0); | |
| if (iResult < DEFAULT_BUFLEN - 1) | |
| answer[iResult] = '\0'; | |
| else | |
| answer[DEFAULT_BUFLEN - 1] = '\0'; | |
| if (iResult > 0) { | |
| cout << "процес сервера надіслав відповідь: " << answer << "\n"; | |
| cout << "отримано байтів: " << iResult << "\n"; | |
| } | |
| else if (iResult == 0) | |
| cout << "з'єднання з сервером закрито.\n"; | |
| else | |
| cout << "recv не вдалося з помилкою: " << WSAGetLastError() << "\n"; | |
| } | |
| closesocket(ConnectSocket); | |
| WSACleanup(); | |
| cout << "процес клієнта завершує свою роботу!\n"; | |
| } |
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") | |
| #define DEFAULT_BUFLEN 512 | |
| #define DEFAULT_PORT "27015" // порт — це логічна конструкція, яка ідентифікує конкретний процес або тип мережевої служби - https://en.wikipedia.org/wiki/Port_(computer_networking) | |
| #define PAUSE 1 | |
| int main() { | |
| system("title СЕРВЕРНА СТОРОНА"); | |
| cout << "серверний процес запущено!\n"; | |
| Sleep(PAUSE); | |
| WSADATA wsaData; // структура WSADATA містить інформацію про реалізацію Windows Sockets: https://docs.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-wsadata | |
| int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); // ініціалізація бібліотеки Winsock DLL: https://firststeps.ru/mfc/net/socket/r.php?2 | |
| addrinfo hints{}; // структура addrinfo використовується для зберігання інформації про адресу хоста | |
| hints.ai_family = AF_INET; // сімейство адрес для IPv4 | |
| hints.ai_socktype = SOCK_STREAM; // протокол TCP | |
| hints.ai_protocol = IPPROTO_TCP; | |
| hints.ai_flags = AI_PASSIVE; // використовується для прив'язки сокета | |
| addrinfo* result = NULL; | |
| iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); // отримання адреси та порту сервера | |
| SOCKET ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); // створення сокета | |
| iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); // прив'язка сокета | |
| freeaddrinfo(result); | |
| iResult = listen(ListenSocket, SOMAXCONN); // переведення сокета в стан очікування вхідних з'єднань | |
| SOCKET ClientSocket = accept(ListenSocket, NULL, NULL); // прийняття вхідного з'єднання | |
| closesocket(ListenSocket); // закриття сокета прослуховування, оскільки з'єднання встановлено | |
| char recvbuf[DEFAULT_BUFLEN]{}; // буфер для отримання даних | |
| int iSendResult; | |
| do { | |
| iResult = recv(ClientSocket, recvbuf, DEFAULT_BUFLEN, 0); // отримання даних від клієнта | |
| if (iResult > 0) { | |
| cout << "байти отримано: " << iResult << "\n"; | |
| cout << "повідомлення: " << recvbuf << "\n"; | |
| // ... підготовка відповіді для клієнта ... !!!!!!! | |
| iSendResult = send(ClientSocket, recvbuf, iResult, 0); // надсилання отриманого повідомлення назад клієнту | |
| if (iSendResult == -1) { | |
| cout << "надсилання не вдалося з помилкою: " << WSAGetLastError() << "\n"; | |
| closesocket(ClientSocket); | |
| WSACleanup(); | |
| return 7; | |
| } | |
| cout << "надіслано байт: " << iSendResult << "\n"; | |
| } | |
| else if (iResult == 0) | |
| cout << "з'єднання закрито\n"; | |
| else { | |
| cout << "recv не вдалося з помилкою: " << WSAGetLastError() << "\n"; | |
| closesocket(ClientSocket); | |
| WSACleanup(); | |
| return 8; | |
| } | |
| } while (iResult > 0); | |
| closesocket(ClientSocket); // закриття клієнтського сокета | |
| WSACleanup(); // завершення роботи з бібліотекою Winsock | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment