xref: /freebsd-13.1/lib/libc/sys/recv.2 (revision cdebaff8)
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.\" 4. 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 18, 2016
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 strict
202.Tn ANSI
203or C99 compilation mode.
204The
205.Dv MSG_WAITFORONE
206flag sets MSG_DONTWAIT after the first message has been received.
207This flag is only relevant for
208.Fn recvmmsg .
209.Pp
210The
211.Fn recvmsg
212system call uses a
213.Fa msghdr
214structure to minimize the number of directly supplied arguments.
215This structure has the following form, as defined in
216.In sys/socket.h :
217.Bd -literal
218struct msghdr {
219	void		*msg_name;	/* optional address */
220	socklen_t	 msg_namelen;	/* size of address */
221	struct iovec	*msg_iov;	/* scatter/gather array */
222	int		 msg_iovlen;	/* # elements in msg_iov */
223	void		*msg_control;	/* ancillary data, see below */
224	socklen_t	 msg_controllen;/* ancillary data buffer len */
225	int		 msg_flags;	/* flags on received message */
226};
227.Ed
228.Pp
229Here
230.Fa msg_name
231and
232.Fa msg_namelen
233specify the destination address if the socket is unconnected;
234.Fa msg_name
235may be given as a null pointer if no names are desired or required.
236The
237.Fa msg_iov
238and
239.Fa msg_iovlen
240arguments
241describe scatter gather locations, as discussed in
242.Xr read 2 .
243The
244.Fa msg_control
245argument,
246which has length
247.Fa msg_controllen ,
248points to a buffer for other protocol control related messages
249or other miscellaneous ancillary data.
250The messages are of the form:
251.Bd -literal
252struct cmsghdr {
253	socklen_t  cmsg_len;	/* data byte count, including hdr */
254	int	   cmsg_level;	/* originating protocol */
255	int	   cmsg_type;	/* protocol-specific type */
256/* followed by
257	u_char	   cmsg_data[]; */
258};
259.Ed
260.Pp
261As an example, one could use this to learn of changes in the data-stream
262in XNS/SPP, or in ISO, to obtain user-connection-request data by requesting
263a
264.Fn recvmsg
265with no data buffer provided immediately after an
266.Fn accept
267system call.
268.Pp
269Open file descriptors are now passed as ancillary data for
270.Dv AF_UNIX
271domain sockets, with
272.Fa cmsg_level
273set to
274.Dv SOL_SOCKET
275and
276.Fa cmsg_type
277set to
278.Dv SCM_RIGHTS .
279The close-on-exec flag on received descriptors is set according to the
280.Dv MSG_CMSG_CLOEXEC
281flag passed to
282.Fn recvmsg .
283.Pp
284Process credentials can also be passed as ancillary data for
285.Dv AF_UNIX
286domain sockets using a
287.Fa cmsg_type
288of
289.Dv SCM_CREDS .
290In this case,
291.Fa cmsg_data
292should be a structure of type
293.Fa cmsgcred ,
294which is defined in
295.In sys/socket.h
296as follows:
297.Bd -literal
298struct cmsgcred {
299	pid_t	cmcred_pid;		/* PID of sending process */
300	uid_t	cmcred_uid;		/* real UID of sending process */
301	uid_t	cmcred_euid;		/* effective UID of sending process */
302	gid_t	cmcred_gid;		/* real GID of sending process */
303	short	cmcred_ngroups;		/* number or groups */
304	gid_t	cmcred_groups[CMGROUP_MAX];	/* groups */
305};
306.Ed
307.Pp
308If a sender supplies ancillary data with enough space for the above struct
309tagged as
310.Dv SCM_CREDS
311control message type to the
312.Fn sendmsg
313system call, then kernel will fill in the credential information of the
314sending process and deliver it to the receiver.
315Since receiver usually has no control over a sender, this method of retrieving
316credential information isn't reliable.
317For reliable retrieval of remote side credentials it is advised to use the
318.Dv LOCAL_CREDS
319socket option on the receiving socket.
320See
321.Xr unix 4
322for details.
323.Pp
324The
325.Fa msg_flags
326field is set on return according to the message received.
327.Dv MSG_EOR
328indicates end-of-record;
329the data returned completed a record (generally used with sockets of type
330.Dv SOCK_SEQPACKET ) .
331.Dv MSG_TRUNC
332indicates that
333the trailing portion of a datagram was discarded because the datagram
334was larger than the buffer supplied.
335.Dv MSG_CTRUNC
336indicates that some
337control data were discarded due to lack of space in the buffer
338for ancillary data.
339.Dv MSG_OOB
340is returned to indicate that expedited or out-of-band data were received.
341.Pp
342The
343.Fn recvmmsg
344system call uses the
345.Fa mmsghdr
346structure, defined as follows in the
347.In sys/socket.h
348header :
349.Bd -literal
350struct mmsghdr {
351	struct msghdr	 msg_hdr;	/* message header */
352	ssize_t		 msg_len;	/* message length */
353};
354.Ed
355.Pp
356On data reception the
357.Fa msg_len
358field is updated to the length of the received message.
359.Sh RETURN VALUES
360These calls except
361.Fn recvmmsg
362return the number of bytes received.
363.Fn recvmmsg
364returns the number of messages received.
365A value of -1 is returned if an error occurred.
366.Sh ERRORS
367The calls fail if:
368.Bl -tag -width Er
369.It Bq Er EBADF
370The argument
371.Fa s
372is an invalid descriptor.
373.It Bq Er ECONNRESET
374The remote socket end is forcibly closed.
375.It Bq Er ENOTCONN
376The socket is associated with a connection-oriented protocol
377and has not been connected (see
378.Xr connect 2
379and
380.Xr accept 2 ) .
381.It Bq Er ENOTSOCK
382The argument
383.Fa s
384does not refer to a socket.
385.It Bq Er EMSGSIZE
386The
387.Fn recvmsg
388system call
389was used to receive rights (file descriptors) that were in flight on the
390connection.
391However, the receiving program did not have enough free file
392descriptor slots to accept them.
393In this case the descriptors are
394closed, any pending data can be returned by another call to
395.Fn recvmsg .
396.It Bq Er EAGAIN
397The socket is marked non-blocking and the receive operation
398would block, or
399a receive timeout had been set
400and the timeout expired before data were received.
401.It Bq Er EINTR
402The receive was interrupted by delivery of a signal before
403any data were available.
404.It Bq Er EFAULT
405The receive buffer pointer(s) point outside the process's
406address space.
407.El
408.Sh SEE ALSO
409.Xr fcntl 2 ,
410.Xr getsockopt 2 ,
411.Xr read 2 ,
412.Xr select 2 ,
413.Xr socket 2 ,
414.Xr unix 4
415.Sh HISTORY
416The
417.Fn recv
418function appeared in
419.Bx 4.2 .
420The
421.Fn recvmmsg
422function appeared in
423.Fx 11.0 .
424