Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created April 7, 2026 15:57
Show Gist options
  • Select an option

  • Save sunmeat/385bdced42838ae7dca19eee77c2ab3c to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/385bdced42838ae7dca19eee77c2ab3c to your computer and use it in GitHub Desktop.
приклад на парі 07.04.2026
#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";
}
#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