Last active
March 27, 2026 08:53
-
-
Save sunmeat/02b60c8a3eaef3b8a0fb3c249d8686fd to your computer and use it in GitHub Desktop.
client server UDP C++ example
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
| 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(); | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://gist.github.com/sunmeat/7f97b30d22622a617ed7568fbacf63db mac os