Получить сообщение из сокета по заданному адресу
#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 );
NULL
, или указатель на объект sockaddr, где функция может хранить исходный адрес сообщения.socklen_t
, определяющий размер from буфера. Функция сохраняет фактический размер адреса в этом объекте.libsocket
Процедура recvfrom() получает сообщение из сокета s, независимо от того, требует ли сокет соединения.
Если from не равен нулю, и сокет не требует соединения, заполняется адрес источника сообщения. Параметр fromlen является параметром "значение-результат", инициализируется размером буфера, связанного с from, и модифицируется при возврате, чтобы указать фактический размер сохраненного адреса.
Данная процедура возвращает длину сообщения в случае успешного завершения. Если сообщение слишком длинное для предоставленного буфера buf, то лишние байты могут быть отброшены в зависимости от типа сокета, из которого получено сообщение - см. socket().
Если в сокете нет доступных сообщений, вызов приема ожидает прибытия сообщения, если только сокет не является блокирующим — см. ioctl() — в таком случае возвращается -1
, а внешняя переменная errno устанавливается в значение EWOULDBLOCK
. Обычно вызовы приема возвращают любые доступные данные в пределах запрошенной суммы, а не ждут полной запрошенного объема; на это поведение влияют параметры уровня сокета SO_RCVLOWAT
и SO_RCVTIMEO
, описанные в getsockopt().
Возможно испольование select() для определения момента, когда прибудет больше данных.
Число полученных байт данных. Если возникла ошибка функция возвращает -1
, код ошибки записывается в errno.
POSIX 1003.1
accept(), connect(), recv(), recvmsg(), select()
Предыдущий раздел: Описание API сетевой библиотеки