Документация по LinuxLinuxDoc.Ru 🔍

udp - протокол датаграмм пользователя UDP (User Datagram Protocol) над IPv4

НАЗВАНИЕ
udp - протокол датаграмм пользователя UDP (User Datagram
Protocol) над IPv4.

СИНТАКСИС
#include
#include
udp_socket = socket(PF_INET, SOCK_DGRAM, 0);

ОПИСАНИЕ
Это реализация протокола датаграмм пользователя (User
Datagram Protocol), описанного в RFC768. Это ненадежная
служба передачи датаграммных пакетов, не основанная на
установке соединения. Пакеты в процессе передачи могут
быть перемешаны или скопированы. UDP генерирует и
проверяет контрольные суммы для выявления ошибок передачи.

При создании сокета UDP его локальный и удаленный адреса
не указываются. Датаграммы могут быть отправлены
немедленно с помощью sendto(2) или sendmsg(2) с правильным
адресом в качестве аргумента. Если для сокета была вызвана
функция connect(2), то устанавливается адрес по умолчанию,
и датаграммы могут быть посланы через send(2) или write(2)
без указания адреса назначения. При этом по-прежнему
возможна передача их по другим адресам с помощью указания
адреса для sendto(2) или sendmsg(2). Для приема пакетов
сокету может быть сначала присвоен локальный адрес с
помощью bind(2). Иначе уровень сокетов автоматически
назначит свободный локальный порт вне границ, определенных
net.ipv4.ip_local_port_range, и привяжет сокет к
INADDR_ANY.

Все операции приема возвращают только один пакет. Если
размер пакета меньше размера буфера, то возвращается буфер
только с данными пакета; если размер пакета больше, то он
укорачивается и устанавливается флаг MSG_TRUNC. MSG_WAIT-
ALL не поддерживается.

Опции IP могут быть отправлены или получены с помощью
опций сокета, описанных в ip(7). Они обрабатываются ядром
только при запущенном соответствующем вызове sysctl (но
по-прежнему передаются пользователю, если эта возможность
отключена). См. ip(7).

Если при передаче установлен флаг MSG_DONTROUTE, то адрес
назначения должен ссылаться на локальный адрес интерфейса,
а пакет посылается только на этот интерфейс.

UDP "разбивает" пакет, если его общая длина превосходит
MTU интерфейса. Более удобной альтернативой является path
MTU discovery, описанная в разделе IP_PMTU_DISCOVER
страницы ip(7).

ФОРМАТ АДРЕСА
UDP использует формат адреса sockaddr_in IPv4, описанный в
ip(7).

ОБРАБОТКА ОШИБОК
Все фатальные ошибки передаются пользователю как
возвращаемый код ошибки, даже если сокет не соединен.
Также передаются асинхронные ошибки, принятые по сети.
Ранние пакеты, посланные на один и тот-же сокет, могут
привести к ошибке. Это отличается от многих других
реализаций сокетов BSD, которые не передают ошибки, пока
сокет не соединен. Такая работа Linux соответствует
RFC1122.

Для совместимости данного кода со старым возможно
установить опцию SO_BSDCOMPAT SOL_SOCKET для получения
ошибок только при наличии соединения (кроме EPROTO и EMSG-
SIZE). Лучше исправить код обработки ошибок на
правильный, нежели запускать данную опцию. Локальные
ошибки всегда передаются.

Если включена опция IP_RECVERR, то все ошибки заносятся в
очередь ошибок сокета и могут быть получены с помощью
recvmsg(2) при установленном флаге MSG_ERRQUEUE.

ВЫЗОВЫ IOCTL

Доступ к ioctl может быть получен, используя ioctl(2).
Правильный синтаксис:

int value;
error = ioctl(tcp_socket, ioctl_type, &value);

SIOCINQ
Получает указатель на целое число в качестве
параметра. Возвращает размер следующей
рассматриваемой датаграммы целым числом, в байтах,
или 0 - если нет датаграмм для рассмотрения.

SIOCOUTQ
Возвращает номер байтов данных в в местной очереди
запросов. Поддерживатся только с Linux 2.4.

Также поддерживаются все ioctl, описанные в ip(7) и
socket(7).

КОДЫ ОШИБОК
Все ошибки, описанные в socket(7) или ip(7), могут быть
получены при отправке или получении их через сокет UDP.

ECONNREFUSED С адресом назначения не был связан ни один
получатель. Это может быть вызвано предыдущим переданным
через сокет пакетом.

ВЕРСИИ
IP_RECVERR появилось в Linux 2.2

ОСОБЫЕ БЛАГОДАРНОСТИ
Эта страница руководства написана Энди Клином Andi Kleen.
Читать новости Linux в Telegram
Linux - udp - протокол датаграмм пользователя UDP (User Datagram Protocol) над IPv4
Мы в соцсетях ✉