recvmsg()

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

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvmsg( int s,
struct msghdr *msg,
int flags );

Аргументы:

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

Библиотека:

libsocket

Описание:

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

Вызов recvmsg() использует структуру msghdr для минимизации числа напрямую поставляемых параметров. Эта структура, определенная в <sys/socket.h>, имеет следующий вид:

struct msghdr {
caddr_t msg_name; /* optional address */
u_int msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
u_int msg_iovlen; /* # elements in msg_iov */
caddr_t msg_control; /* ancillary data, see below */
u_int msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};

Параметры msg_name и msg_namelen задают адрес (адрес источника для recvmsg(); адрес назначения для sendmsg()) если сокет не соединен; параметр msg_name может быть нулевым указателем в случае, если никаких имен не требуется.

Параметры msg_iov и msg_iovlen описывают разрозненные участки памяти, что описано в read().

Параметр msg_control, длина которого определяется параметром msg_controllen, указывает на буфер для других сообщений, связанных с управлением протоколом, или для других различных вспомогательных данных. Сообщения имеют форму:

struct cmsghdr {
u_int cmsg_len; /* data byte count, including hdr */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by u_char cmsg_data[]; */
};

Поле msg_flags устанавливается при возврате в соответствии с полученным сообщением:

MSG_CTRUNC
Указывает, что некоторые данные управления были отброшены из-за нехватки места в буфере для вспомогательных данных.
MSG_EOR
Указывает на конец записи; возвращенные данные завершили запись.
MSG_OOB
Указывает, что были получены срочные или внеполосные данные.
MSG_TRUNC
Указывает, что завершающая часть датаграммы была отброшена, поскольку датаграмма была больше, чем предоставленный буфер.

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

Количество принятых байт.

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

Коды ошибок:

ENOMEM
Недостаточно памяти.

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

POSIX 1003.1

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

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

recv(), recvfrom(), sendmsg()




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