Получить сообщение и его заголовок из сокета
#include <sys/types.h>#include <sys/socket.h>ssize_t recvmsg( int s,struct msghdr *msg,int flags );
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 устанавливается при возврате в соответствии с полученным сообщением:
Количество принятых байт.
Если возникла ошибка функция возвращает -1
, код ошибки записывается в errno.
POSIX 1003.1
Предыдущий раздел: Описание API сетевой библиотеки