1.\" Copyright (c) 1983, 1990, 1991, 1993 2.\" The Regents of the University of California. All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" 3. Neither the name of the University nor the names of its contributors 13.\" may be used to endorse or promote products derived from this software 14.\" without specific prior written permission. 15.\" 16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26.\" SUCH DAMAGE. 27.\" 28.\" @(#)recv.2 8.3 (Berkeley) 2/21/94 29.\" $FreeBSD$ 30.\" 31.Dd August 19, 2018 32.Dt RECV 2 33.Os 34.Sh NAME 35.Nm recv , 36.Nm recvfrom , 37.Nm recvmsg , 38.Nm recvmmsg 39.Nd receive message(s) from a socket 40.Sh LIBRARY 41.Lb libc 42.Sh SYNOPSIS 43.In sys/socket.h 44.Ft ssize_t 45.Fn recv "int s" "void *buf" "size_t len" "int flags" 46.Ft ssize_t 47.Fn recvfrom "int s" "void *buf" "size_t len" "int flags" "struct sockaddr * restrict from" "socklen_t * restrict fromlen" 48.Ft ssize_t 49.Fn recvmsg "int s" "struct msghdr *msg" "int flags" 50.Ft ssize_t 51.Fn recvmmsg "int s" "struct mmsghdr * restrict msgvec" "size_t vlen" "int flags" "const struct timespec * restrict timeout" 52.Sh DESCRIPTION 53The 54.Fn recvfrom , 55.Fn recvmsg , 56and 57.Fn recvmmsg 58system calls 59are used to receive messages from a socket, 60and may be used to receive data on a socket whether or not 61it is connection-oriented. 62.Pp 63If 64.Fa from 65is not a null pointer 66and the socket is not connection-oriented, 67the source address of the message is filled in. 68The 69.Fa fromlen 70argument 71is a value-result argument, initialized to the size of 72the buffer associated with 73.Fa from , 74and modified on return to indicate the actual size of the 75address stored there. 76.Pp 77The 78.Fn recv 79function is normally used only on a 80.Em connected 81socket (see 82.Xr connect 2 ) 83and is identical to 84.Fn recvfrom 85with a 86null pointer passed as its 87.Fa from 88argument. 89.Pp 90The 91.Fn recvmmsg 92function is used to receive multiple 93messages at a call. 94Their number is supplied by 95.Fa vlen . 96The messages are placed in the buffers described by 97.Fa msgvec 98vector, after reception. 99The size of each received message is placed in the 100.Fa msg_len 101field of each element of the vector. 102If 103.Fa timeout 104is NULL the call blocks until the data is available for each 105supplied message buffer. 106Otherwise it waits for data for the specified amount of time. 107If the timeout expired and there is no data received, 108a value 0 is returned. 109The 110.Xr ppoll 2 111system call is used to implement the timeout mechanism, 112before first receive is performed. 113.Pp 114The 115.Fn recv , 116.Fn recvfrom 117and 118.Fn recvmsg 119return the length of the message on successful 120completion, whereas 121.Fn recvmmsg 122returns the number of received messages. 123If a message is too long to fit in the supplied buffer, 124excess bytes may be discarded depending on the type of socket 125the message is received from (see 126.Xr socket 2 ) . 127.Pp 128If no messages are available at the socket, the 129receive call waits for a message to arrive, unless 130the socket is non-blocking (see 131.Xr fcntl 2 ) 132in which case the value 133\-1 is returned and the global variable 134.Va errno 135is set to 136.Er EAGAIN . 137The receive calls except 138.Fn recvmmsg 139normally return any data available, 140up to the requested amount, 141rather than waiting for receipt of the full amount requested; 142this behavior is affected by the socket-level options 143.Dv SO_RCVLOWAT 144and 145.Dv SO_RCVTIMEO 146described in 147.Xr getsockopt 2 . 148The 149.Fn recvmmsg 150function implements this behaviour for each message in the vector. 151.Pp 152The 153.Xr select 2 154system call may be used to determine when more data arrives. 155.Pp 156The 157.Fa flags 158argument to a 159.Fn recv 160function is formed by 161.Em or Ap ing 162one or more of the values: 163.Bl -column ".Dv MSG_CMSG_CLOEXEC" -offset indent 164.It Dv MSG_OOB Ta process out-of-band data 165.It Dv MSG_PEEK Ta peek at incoming message 166.It Dv MSG_WAITALL Ta wait for full request or error 167.It Dv MSG_DONTWAIT Ta do not block 168.It Dv MSG_CMSG_CLOEXEC Ta set received fds close-on-exec 169.It Dv MSG_WAITFORONE Ta do not block after receiving the first message 170(only for 171.Fn recvmmsg 172) 173.El 174.Pp 175The 176.Dv MSG_OOB 177flag requests receipt of out-of-band data 178that would not be received in the normal data stream. 179Some protocols place expedited data at the head of the normal 180data queue, and thus this flag cannot be used with such protocols. 181The 182.Dv MSG_PEEK 183flag causes the receive operation to return data 184from the beginning of the receive queue without removing that 185data from the queue. 186Thus, a subsequent receive call will return the same data. 187The 188.Dv MSG_WAITALL 189flag requests that the operation block until 190the full request is satisfied. 191However, the call may still return less data than requested 192if a signal is caught, an error or disconnect occurs, 193or the next data to be received is of a different type than that returned. 194The 195.Dv MSG_DONTWAIT 196flag requests the call to return when it would block otherwise. 197If no data is available, 198.Va errno 199is set to 200.Er EAGAIN . 201This flag is not available in 202.St -ansiC 203or 204.St -isoC-99 205compilation mode. 206The 207.Dv MSG_WAITFORONE 208flag sets MSG_DONTWAIT after the first message has been received. 209This flag is only relevant for 210.Fn recvmmsg . 211.Pp 212The 213.Fn recvmsg 214system call uses a 215.Fa msghdr 216structure to minimize the number of directly supplied arguments. 217This structure has the following form, as defined in 218.In sys/socket.h : 219.Bd -literal 220struct msghdr { 221 void *msg_name; /* optional address */ 222 socklen_t msg_namelen; /* size of address */ 223 struct iovec *msg_iov; /* scatter/gather array */ 224 int msg_iovlen; /* # elements in msg_iov */ 225 void *msg_control; /* ancillary data, see below */ 226 socklen_t msg_controllen;/* ancillary data buffer len */ 227 int msg_flags; /* flags on received message */ 228}; 229.Ed 230.Pp 231Here 232.Fa msg_name 233and 234.Fa msg_namelen 235specify the source address if the socket is unconnected; 236.Fa msg_name 237may be given as a null pointer if no names are desired or required. 238The 239.Fa msg_iov 240and 241.Fa msg_iovlen 242arguments 243describe scatter gather locations, as discussed in 244.Xr read 2 . 245The 246.Fa msg_control 247argument, 248which has length 249.Fa msg_controllen , 250points to a buffer for other protocol control related messages 251or other miscellaneous ancillary data. 252The messages are of the form: 253.Bd -literal 254struct cmsghdr { 255 socklen_t cmsg_len; /* data byte count, including hdr */ 256 int cmsg_level; /* originating protocol */ 257 int cmsg_type; /* protocol-specific type */ 258/* followed by 259 u_char cmsg_data[]; */ 260}; 261.Ed 262.Pp 263As an example, the SO_TIMESTAMP socket option returns a reception 264timestamp for UDP packets. 265.Pp 266With 267.Dv AF_UNIX 268domain sockets, ancillary data can be used to pass file descriptors and 269process credentials. 270See 271.Xr unix 4 272for details. 273.Pp 274The 275.Fa msg_flags 276field is set on return according to the message received. 277.Dv MSG_EOR 278indicates end-of-record; 279the data returned completed a record (generally used with sockets of type 280.Dv SOCK_SEQPACKET ) . 281.Dv MSG_TRUNC 282indicates that 283the trailing portion of a datagram was discarded because the datagram 284was larger than the buffer supplied. 285.Dv MSG_CTRUNC 286indicates that some 287control data were discarded due to lack of space in the buffer 288for ancillary data. 289.Dv MSG_OOB 290is returned to indicate that expedited or out-of-band data were received. 291.Pp 292The 293.Fn recvmmsg 294system call uses the 295.Fa mmsghdr 296structure, defined as follows in the 297.In sys/socket.h 298header: 299.Bd -literal 300struct mmsghdr { 301 struct msghdr msg_hdr; /* message header */ 302 ssize_t msg_len; /* message length */ 303}; 304.Ed 305.Pp 306On data reception the 307.Fa msg_len 308field is updated to the length of the received message. 309.Sh RETURN VALUES 310These calls except 311.Fn recvmmsg 312return the number of bytes received. 313.Fn recvmmsg 314returns the number of messages received. 315A value of -1 is returned if an error occurred. 316.Sh ERRORS 317The calls fail if: 318.Bl -tag -width Er 319.It Bq Er EBADF 320The argument 321.Fa s 322is an invalid descriptor. 323.It Bq Er ECONNRESET 324The remote socket end is forcibly closed. 325.It Bq Er ENOTCONN 326The socket is associated with a connection-oriented protocol 327and has not been connected (see 328.Xr connect 2 329and 330.Xr accept 2 ) . 331.It Bq Er ENOTSOCK 332The argument 333.Fa s 334does not refer to a socket. 335.It Bq Er EMSGSIZE 336The 337.Fn recvmsg 338system call 339was used to receive rights (file descriptors) that were in flight on the 340connection. 341However, the receiving program did not have enough free file 342descriptor slots to accept them. 343In this case the descriptors are 344closed, any pending data can be returned by another call to 345.Fn recvmsg . 346.It Bq Er EAGAIN 347The socket is marked non-blocking and the receive operation 348would block, or 349a receive timeout had been set 350and the timeout expired before data were received. 351.It Bq Er EINTR 352The receive was interrupted by delivery of a signal before 353any data were available. 354.It Bq Er EFAULT 355The receive buffer pointer(s) point outside the process's 356address space. 357.El 358.Sh SEE ALSO 359.Xr fcntl 2 , 360.Xr getsockopt 2 , 361.Xr read 2 , 362.Xr select 2 , 363.Xr socket 2 , 364.Xr CMSG_DATA 3 , 365.Xr unix 4 366.Sh HISTORY 367The 368.Fn recv 369function appeared in 370.Bx 4.2 . 371The 372.Fn recvmmsg 373function appeared in 374.Fx 11.0 . 375