Введение в 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.