При работе с UDP сокетом для приема и передачи данных используются
функции recvfrom и sendto.
ssize_t sendto(int socket, const void *message,
size_t length, int flags,
const struct sockaddr *dest_addr,
socklen_t dest_len);
Функция sendto предназначена для отправки данных. Аргументы
функции имеют следующее значение:
socket
сокет, через который будут отправлены данные.
message
указатель на буфер, содержащий данные для отправки.
length
определяет длину сообщения в байтах.
flags
определяет параметры передачи сообщения. Значение flags
является результатом логического ИЛИ нуля или большего числа следующих
констант:
MSG_OOB
передать срочные данные (не поддерживается протоколом
UDP).
MSG_DONTROUTE
игнорировать параметры маршрутизации.
dest_addr
указатель на структуру, содержащую адрес получателя.
dest_len
определяет длину структуры, на которую указывает dest_addr
Функция возвращает число переданных байт в случае успешного завершения и
-1 в противном случае. Следует заметить, что успешное выполнение функции
sendto не гарантирует доставку данных получателю. Возврат значения
-1 происходит только в случае локально обнаруженных ошибок.
Функция recvfrom принимает данные из сокета. Аргументы функции
имеют следующее значение:
socket
сокет из которого производится чтение данных.
buffer
указатель на буфер, в который будут помещены данные.
length
определяет длину буфера, на который указывает аргумент
buffer.
flags
определяет параметры приема данных. Значение flags
является результатом логического ИЛИ нуля или большего числа следующих
констант:
MSG_PEEK
оставить принятые данные в буфере приема. Следующий
вызов recvfrom получит те же данные.
MSG_OOB
принимать только срочные данные (не поддерживается
протоколом UDP).
MSG_WAITALL
блокировать функцию, пока не будет принят полный
объем данных, определенный аргументом length. Функция может
вернуть меньший объем данных в случае обрыва соединения, ошибки,
связанной с сокетом, использования флага MSG_PEEK.
address
указатель на структуру, в которую будет помещен адрес
отправителя.
address_len
определяет длину структуры, на которую указывает
address.
Функция возвращет количество данных, записаных в буфер. Если при
выполнении функции возникли ошибки, то возвращается значение -1. Для
протокола UDP, данные, пришедшие в одном пакете, должны быть прочитаны
одним вызовом функции recvfrom. Если длина буфера недостаточна
для размещения всех данных, то лишние байты отбрасываются.