Получить сообщение из сокета
#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 сетевой библиотеки