Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created March 27, 2026 06:49
Show Gist options
  • Select an option

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

Select an option

Save sunmeat/7f97b30d22622a617ed7568fbacf63db to your computer and use it in GitHub Desktop.
client server UDP C++ example mac os version
CLIENT SIDE:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
using namespace std;
#define SERVER "127.0.0.1"
#define BUFLEN 512
#define PORT 8888
class UDPClient {
public:
UDPClient() {
// створення сокета
if ((client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
perror("помилка створення сокета");
exit(EXIT_FAILURE);
}
cout << "сокет створено.\n";
// налаштування структури адреси сервера
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(SERVER);
}
~UDPClient() {
close(client_socket);
}
void start() {
while (true) {
char message[BUFLEN];
cout << "введіть повідомлення: ";
cin.getline(message, BUFLEN);
// надсилання повідомлення серверу
if (sendto(client_socket, message, strlen(message), 0,
(sockaddr*)&server, sizeof(server)) < 0) {
perror("помилка надсилання");
exit(EXIT_FAILURE);
}
cout << "очікуйте відповідь від сервера...\n";
// отримання відповіді від сервера
char answer[BUFLEN] = {};
socklen_t slen = sizeof(server);
ssize_t answer_length = recvfrom(client_socket, answer, BUFLEN, 0,
(sockaddr*)&server, &slen);
if (answer_length < 0) {
perror("помилка отримання даних");
exit(EXIT_FAILURE);
}
answer[answer_length] = '\0';
cout << "відповідь сервера: " << answer << "\n";
}
}
private:
int client_socket;
sockaddr_in server{};
};
int main() {
cout << "=== UDP КЛІЄНТСЬКА СТОРОНА ===\n";
UDPClient udpClient;
udpClient.start();
}
==============================================================================================
SERVER SIDE:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
using namespace std;
#define BUFLEN 512
#define PORT 8888
class UDPServer {
public:
UDPServer() {
// створення сокета
if ((server_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("не вдалося створити сокет");
exit(EXIT_FAILURE);
}
cout << "сокет створено.\n";
// налаштування структури sockaddr_in
memset(&server, 0, sizeof(server));
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)) < 0) {
perror("помилка прив'язки");
exit(EXIT_FAILURE);
}
cout << "прив'язка виконана. сервер слухає на порту " << PORT << ".\n";
}
~UDPServer() {
close(server_socket);
}
void start() {
while (!exitRequested) {
cout << "очікуйте дані від клієнта...\n";
char message[BUFLEN] = {};
socklen_t slen = sizeof(client);
// отримання даних (блокуючий виклик)
ssize_t message_len = recvfrom(server_socket, message, BUFLEN, 0,
(sockaddr*)&client, &slen);
if (message_len < 0) {
perror("помилка recvfrom()");
exit(EXIT_FAILURE);
}
message[message_len] = '\0';
// виведення інформації про клієнта та отримані дані
cout << "отримано пакет від "
<< inet_ntoa(client.sin_addr)
<< ":" << ntohs(client.sin_port) << "\n";
cout << "дані: " << message << "\n";
cout << "введіть відповідь (exit для виходу): ";
cin.getline(message, BUFLEN);
// надсилання відповіді клієнту
if (sendto(server_socket, message, strlen(message), 0,
(sockaddr*)&client, slen) < 0) {
perror("помилка sendto()");
exit(EXIT_FAILURE);
}
if (strcmp(message, "exit") == 0) {
cout << "завершення роботи сервера...\n";
exitRequested = true;
}
}
}
private:
int server_socket = 0;
sockaddr_in server{}, client{};
bool exitRequested = false;
};
int main() {
cout << "=== UDP СЕРВЕРНА СТОРОНА ===\n";
UDPServer udpServer;
udpServer.start();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment