Last active
September 19, 2025 09:06
-
-
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> | |
| using namespace std; | |
| #pragma comment(lib,"ws2_32.lib") // підключення бібліотеки winsock | |
| #pragma warning(disable:4996) | |
| #define SERVER "127.0.0.1" // ip-адреса сервера (локальний хост) | |
| #define BUFLEN 512 // максимальна довжина відповіді | |
| #define PORT 8888 // порт для прийому даних | |
| class UDPClient { | |
| public: | |
| UDPClient() { | |
| // ініціалізація winsock | |
| cout << "ініціалізація winsock...\n"; | |
| if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) { | |
| cout << "помилка ініціалізації. код помилки: " << WSAGetLastError() << "\n"; | |
| exit(EXIT_FAILURE); | |
| } | |
| cout << "ініціалізація завершена.\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)); | |
| server.sin_family = AF_INET; | |
| server.sin_port = htons(PORT); | |
| server.sin_addr.S_un.S_addr = inet_addr(SERVER); | |
| } | |
| ~UDPClient() { | |
| // закриття сокета та очищення winsock | |
| closesocket(client_socket); | |
| WSACleanup(); | |
| } | |
| void start() { | |
| while (true) { | |
| char message[BUFLEN]; | |
| cout << "введіть повідомлення: "; | |
| cin.getline(message, BUFLEN); | |
| // надсилання повідомлення серверу | |
| if (sendto(client_socket, message, strlen(message), 0, (sockaddr*)&server, sizeof(sockaddr_in)) == SOCKET_ERROR) { | |
| cout << "помилка надсилання. код помилки: " << WSAGetLastError() << "\n"; | |
| exit(EXIT_FAILURE); | |
| } | |
| cout << "очікуйте відповідь від сервера...\n"; | |
| // отримання відповіді від сервера | |
| char answer[BUFLEN] = {}; | |
| int slen = sizeof(sockaddr_in); | |
| int answer_length; | |
| if ((answer_length = recvfrom(client_socket, answer, BUFLEN, 0, (sockaddr*)&server, &slen)) == SOCKET_ERROR) { | |
| cout << "помилка отримання даних. код помилки: " << WSAGetLastError() << "\n"; | |
| exit(EXIT_FAILURE); | |
| } | |
| cout << "відповідь сервера: " << answer << "\n"; | |
| } | |
| } | |
| private: | |
| WSADATA ws; // дані winsock | |
| SOCKET client_socket; // сокет клієнта | |
| sockaddr_in server; // адреса сервера | |
| }; | |
| int main() { | |
| system("title UDP КЛІЄНТСЬКА СТОРОНА"); | |
| setlocale(0, ""); | |
| UDPClient udpClient; | |
| udpClient.start(); | |
| } | |
| ========================================================================================================================== | |
| SERVER SIDE: | |
| #include <iostream> | |
| #include <winsock2.h> | |
| using namespace std; | |
| #pragma comment(lib,"ws2_32.lib") // бібліотека winsock | |
| #pragma warning(disable:4996) | |
| #define BUFLEN 512 // розмір буфера | |
| #define PORT 8888 // порт сервера | |
| class UDPServer { | |
| public: | |
| UDPServer() { | |
| // ініціалізація winsock | |
| cout << "ініціалізація winsock...\n"; | |
| if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { | |
| cout << "помилка ініціалізації: " << WSAGetLastError() << "\n"; | |
| exit(0); | |
| } | |
| cout << "ініціалізація завершена.\n"; | |
| // створення сокета | |
| if ((server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == 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 (!exitRequested) { | |
| cout << "очікуйте дані від клієнта...\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(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, sizeof(sockaddr_in)) == SOCKET_ERROR) { | |
| cout << "помилка sendto(): " << WSAGetLastError() << "\n"; | |
| exit(EXIT_FAILURE); | |
| } | |
| if (strcmp(message, "exit") == 0) { | |
| cout << "завершення роботи сервера...\n"; | |
| exitRequested = true; | |
| break; | |
| } | |
| } | |
| } | |
| private: | |
| WSADATA wsa{}; | |
| SOCKET server_socket = 0; | |
| sockaddr_in server{}, client{}; | |
| bool exitRequested = false; | |
| }; | |
| int main() { | |
| system("title UDP СЕРВЕРНА СТОРОНА"); | |
| setlocale(0, ""); | |
| UDPServer udpServer; | |
| udpServer.start(); | |
| } |
Author
It seems line 157-158 is unreachable, right?
Hi, @wirekang! I made a check so that the server can stop its work now :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It seems line 157-158 is unreachable, right?