Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created February 26, 2026 07:16
Show Gist options
  • Select an option

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

Select an option

Save sunmeat/b669875856e6c9a0c42b8972750b57ae to your computer and use it in GitHub Desktop.
ДЗ на тему сокетів
#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;
}
}
}
#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