recv()

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

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv( int s,
void *buf,
size_t len,
int flags );

Аргументы:

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

Библиотека:

libsocket

Описание:

Функция recv() получает сообщение из сокета. Обычно используется только на подключенном сокете — см. connect() — и идентична recvfrom() с нулевым параметром 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(), ioctl(), getsockopt(), read(), recvfrom(), recvmsg(), select(), socket()




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