Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active March 27, 2026 08:53
Show Gist options
  • Select an option

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

Select an option

Save sunmeat/02b60c8a3eaef3b8a0fb3c249d8686fd to your computer and use it in GitHub Desktop.
client server UDP C++ example
CLIENT SIDE:
#include <iostream>
#include <winsock2.h> // хедери функцій
#include <ws2tcpip.h> // inet_pton
using namespace std;
#pragma comment(lib,"ws2_32.lib") // реалізація бiблiотеки winsock
#define SERVER_IP "127.0.0.1" // ip-адреса сервера (локальний хост)
#define BUFLEN 512 // максимальна довжина повідомлення
#define SERVER_PORT 8888 // порт сервера
class UDPClient {
public:
UDPClient() {
// iнiцiалiзацiя winsock
cout << "iнiцiалiзацiя winsock...\n";
if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) {
cout << "помилка iнiцiалiзацiї. код помилки: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "iнiцiалiзацiя завершена успішно.\n";
// створення сокета
if ((client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) {
cout << "помилка створення сокета. код помилки: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
// налаштування структури адреси сервера
// два рядки нижче не потрібні, тому що поле класа було проініціалізоване {}
// memset((char*)&server, 0, sizeof(server));
// ZeroMemory(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(SERVER_PORT);
// server.sin_addr.S_un.S_addr = inet_addr(SERVER);
if (inet_pton(AF_INET, SERVER_IP, &server.sin_addr) != 1)
cout << "Помилка: невалідна IP адреса: " << SERVER_IP << "\n"; // обробка помилки - невалідна IP-адреса
}
~UDPClient() {
// закриття сокета та очищення winsock
closesocket(client_socket);
WSACleanup();
}
void start() {
int slen = sizeof(sockaddr_in);
while (true) {
char message[BUFLEN]{};
cout << "введiть повiдомлення: ";
cin.getline(message, BUFLEN);
// надсилання повiдомлення серверу
if (sendto(client_socket, message, strlen(message), 0, (sockaddr*)&server, slen) == SOCKET_ERROR) {
cout << "помилка надсилання. код помилки: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "очiкуйте вiдповiдь вiд сервера...\n";
// отримання вiдповiдi вiд сервера
char answer[BUFLEN]{};
int answer_length = -1;
if ((answer_length = recvfrom(client_socket, answer, BUFLEN, 0, (sockaddr*)&server, &slen)) == SOCKET_ERROR) {
cout << "помилка отримання даних. код помилки: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "вiдповiдь сервера: " << answer << "\n";
}
}
private:
WSADATA ws; // данi winsock
SOCKET client_socket; // сокет клiєнта
sockaddr_in server{}; // адреса сервера
};
int main() {
system("title UDP КЛІЄНТСЬКА СТОРОНА");
// setlocale(0, "");
UDPClient udpClient;
udpClient.start();
}
==========================================================================================================================
SERVER SIDE:
#include <iostream>
#include <winsock2.h> // хедери (заголовки функцій) UDP
#include <ws2tcpip.h> // inet_ntop
using namespace std;
#pragma comment(lib,"ws2_32.lib") // реалізація бiблiотеки winsock
#define BUFLEN 512 // розмiр буфера
#define PORT 8888 // порт сервера
class UDPServer {
public:
UDPServer() {
// iнiцiалiзацiя winsock
cout << "iнiцiалiзацiя winsock...\n";
if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) {
cout << "помилка iнiцiалiзацiї: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "iнiцiалiзацiя winsock завершена успішно.\n";
// створення сокета
if ((server_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
cout << "не вдалося створити сокет: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "сокет створено.\n";
// налаштування структури sockaddr_in
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PORT);
// прив'язка сокета
if (bind(server_socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
cout << "помилка прив'язки: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "прив'язка сокета виконана успішно.\n";
}
~UDPServer() {
closesocket(server_socket);
WSACleanup();
}
void start() {
while (true) {
cout << "очiкуйте данi вiд клiєнта...\n";
char message[BUFLEN]{};
// отримання даних (блокуючий виклик)
int message_len;
int slen = sizeof(sockaddr_in);
if ((message_len = recvfrom(server_socket, message, BUFLEN, 0, (sockaddr*)&client, &slen)) == SOCKET_ERROR) {
cout << "помилка recvfrom(): " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
// виведення iнформацiї про клiєнта та отриманi данi
// cout << "отримано пакет вiд " << inet_ntoa(client.sin_addr) << " " << ntohs(client.sin_port) << "\n";
char ip_str[INET_ADDRSTRLEN]; // 255.255.255.255:65000
inet_ntop(AF_INET, &client.sin_addr, ip_str, INET_ADDRSTRLEN);
cout << "отримано пакет вiд: " << ip_str << ", порт: " << ntohs(client.sin_port) << "\n";
cout << "данi: " << message << "\n";
cout << "введiть вiдповiдь (exit для виходу): ";
cin.getline(message, BUFLEN);
// надсилання вiдповiдi клiєнту
if (sendto(server_socket, message, strlen(message), 0, (sockaddr*)&client, sizeof(sockaddr_in)) == SOCKET_ERROR) {
cout << "помилка sendto(): " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
if (strcmp(message, "exit") == 0) {
cout << "завершення роботи сервера...\n";
break;
}
}
}
private:
WSADATA ws;
SOCKET server_socket = INVALID_SOCKET;
sockaddr_in server{}, client{};
};
int main() {
system("title UDP СЕРВЕРНА СТОРОНА");
// setlocale(0, ""); // розкоментуйте, якщо не виводиться кирилиця
UDPServer udpServer;
udpServer.start();
}
@sunmeat
Copy link
Copy Markdown
Author

sunmeat commented Feb 4, 2024

It seems line 157-158 is unreachable, right?

Hi, @wirekang! I made a check so that the server can stop its work now :)

@sunmeat
Copy link
Copy Markdown
Author

sunmeat commented Mar 27, 2026

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment