Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpUdInr 681 of 696 menu
◀ ▶

Введение в UDP в C++

Отдельные датаграммы, блоки байтов с адресом получателя, передает протокол UDP.

Соединение заранее не открывают: каждый пакет несет хост и порт назначения. В POSIX для этого берут тип SOCK_DGRAM у функции socket, отправку через sendto и прием через recvfrom в буфер фиксированного размера.

Приемник привязывает сокет к 127.0.0.1 и порту 18081 вызовом bind. Отправитель шлет короткий текст на тот же адрес. Оба конца удобно держать в одном main: приемник в std::thread, дескрипторы закрывают через close:

#include <arpa/inet.h> #include <atomic> #include <cstring> #include <iostream> #include <netinet/in.h> #include <string> #include <sys/socket.h> #include <thread> #include <unistd.h> int main() { std::atomic<bool> ready{false}; std::thread receiver([&]() { int recv_fd = socket(AF_INET, SOCK_DGRAM, 0); if (recv_fd == -1) { return; } sockaddr_in local{}; local.sin_family = AF_INET; local.sin_port = htons(18081); if (inet_pton(AF_INET, "127.0.0.1", &local.sin_addr) != 1 || bind( recv_fd, reinterpret_cast<sockaddr*>(&local), sizeof(local) ) == -1) { close(recv_fd); return; } ready.store(true, std::memory_order_release); char buf[256]; sockaddr_in peer{}; socklen_t peer_len = sizeof(peer); ssize_t n = recvfrom( recv_fd, buf, sizeof(buf), 0, reinterpret_cast<sockaddr*>(&peer), &peer_len ); if (n > 0) { std::string text(buf, static_cast<size_t>(n)); std::cout << text << "\n"; } close(recv_fd); }); while (!ready.load(std::memory_order_acquire)) { } int send_fd = socket(AF_INET, SOCK_DGRAM, 0); if (send_fd == -1) { receiver.join(); return 1; } sockaddr_in dest{}; dest.sin_family = AF_INET; dest.sin_port = htons(18081); if (inet_pton(AF_INET, "127.0.0.1", &dest.sin_addr) != 1) { close(send_fd); receiver.join(); return 1; } const char msg[] = "hello udp"; if (sendto( send_fd, msg, std::strlen(msg), 0, reinterpret_cast<sockaddr*>(&dest), sizeof(dest) ) == -1) { close(send_fd); receiver.join(); return 1; } close(send_fd); receiver.join(); return 0; }

В консоли приемника появится строка hello udp. Такой одноразовый обмен показывает суть UDP: один пакет - один адрес, без рукопожатия как у TCP.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить