Created
March 27, 2026 06:49
-
-
Save sunmeat/7f97b30d22622a617ed7568fbacf63db to your computer and use it in GitHub Desktop.
client server UDP C++ example mac os version
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 <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