recvfrom()

Получить сообщение из сокета по заданному адресу

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom( int s,
void *buff,
size_t len,
int flags,
struct sockaddr *from,
socklen_t *fromlen );

Аргументы:

s
Дескриптор сокета; см. socket().
buf
Указатель на буфер, в котором функция может хранить сообщение.
len
Размер буфера.
flags
Комбинация, образованная операцией ИЛИ из одного или нескольких значений:
MSG_OOB
обрабатывать внеполосные данные. Этот флаг запрашивает получение внеполосных данных, которые не были бы получены в обычном потоке данных. Невозможно использовать этот флаг с протоколами, которые помещают срочные данные в начало обычной очереди данных.
MSG_PEEK
посмотреть на входящее сообщение. Этот флаг заставляет операцию приема возвращать данные из начала очереди приема без удаления этих данных из очереди. Таким образом, последующий вызов приема вернет те же данные.
MSG_WAITALL
дождаться полного запроса либо ошибки. Этот флаг запрашивает блокировку операции до тех пор, пока не будет удовлетворен полный запрос. Но вызов может по-прежнему возвращать меньше данных, чем запрошено, если обнаружен сигнал, если происходит ошибка или отключение, или если следующие данные, которые должны быть получены, имеют другой тип, чем те, что были возвращены.
from
NULL, или указатель на объект sockaddr, где функция может хранить исходный адрес сообщения.
fromlen
Указатель на объект socklen_t, определяющий размер from буфера. Функция сохраняет фактический размер адреса в этом объекте.

Библиотека:

libsocket

Описание:

Процедура recvfrom() получает сообщение из сокета s, независимо от того, требует ли сокет соединения.

Если from не равен нулю, и сокет не требует соединения, заполняется адрес источника сообщения. Параметр fromlen является параметром "значение-результат", инициализируется размером буфера, связанного с from, и модифицируется при возврате, чтобы указать фактический размер сохраненного адреса.

Данная процедура возвращает длину сообщения в случае успешного завершения. Если сообщение слишком длинное для предоставленного буфера buf, то лишние байты могут быть отброшены в зависимости от типа сокета, из которого получено сообщение - см. socket().

Если в сокете нет доступных сообщений, вызов приема ожидает прибытия сообщения, если только сокет не является блокирующим — см. ioctl() — в таком случае возвращается -1, а внешняя переменная errno устанавливается в значение EWOULDBLOCK. Обычно вызовы приема возвращают любые доступные данные в пределах запрошенной суммы, а не ждут полной запрошенного объема; на это поведение влияют параметры уровня сокета SO_RCVLOWAT и SO_RCVTIMEO, описанные в getsockopt().

Возможно испольование select() для определения момента, когда прибудет больше данных.

Возвращаемое значение:

Число полученных байт данных. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EBADF
Некорректный дескриптор s.
EFAULT
Буфер приема находится за пределами адресного пространства процесса.
EINTR
Прием был прерван доставкой сигнала до того, как какие-либо данные были доступны.
ENOTCONN
Сокет связан с протоколом, ориентированным на соединение, и не был подключен; см. connect() и accept().
EWOULDBLOCK
Либо сокет помечен как неблокирующий, и операция приема будет заблокирована, либо был установлен тайм-аут приема, и время ожидания истекло до того, как были получены данные.

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

accept(), connect(), recv(), recvmsg(), select()




Предыдущий раздел: Описание API сетевой библиотеки