xref: /freebsd-13.1/lib/libc/sys/recv.2 (revision 01652e9c)
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