]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - lib/libc/sys/recv.2
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / lib / libc / sys / recv.2
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 December 28, 2006
32 .Dt RECV 2
33 .Os
34 .Sh NAME
35 .Nm recv ,
36 .Nm recvfrom ,
37 .Nm recvmsg
38 .Nd receive a message from a socket
39 .Sh LIBRARY
40 .Lb libc
41 .Sh SYNOPSIS
42 .In sys/types.h
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 * restrict 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 .Sh DESCRIPTION
51 The
52 .Fn recvfrom
53 and
54 .Fn recvmsg
55 system calls
56 are used to receive messages from a socket,
57 and may be used to receive data on a socket whether or not
58 it is connection-oriented.
59 .Pp
60 If
61 .Fa from
62 is not a null pointer
63 and the socket is not connection-oriented,
64 the source address of the message is filled in.
65 The
66 .Fa fromlen
67 argument
68 is a value-result argument, initialized to the size of
69 the buffer associated with
70 .Fa from ,
71 and modified on return to indicate the actual size of the
72 address stored there.
73 .Pp
74 The
75 .Fn recv
76 function is normally used only on a
77 .Em connected
78 socket (see
79 .Xr connect 2 )
80 and is identical to
81 .Fn recvfrom
82 with a
83 null pointer passed as its
84 .Fa from
85 argument.
86 As it is redundant, it may not be supported in future releases.
87 .Pp
88 All three routines return the length of the message on successful
89 completion.
90 If a message is too long to fit in the supplied buffer,
91 excess bytes may be discarded depending on the type of socket
92 the message is received from (see
93 .Xr socket 2 ) .
94 .Pp
95 If no messages are available at the socket, the
96 receive call waits for a message to arrive, unless
97 the socket is non-blocking (see
98 .Xr fcntl 2 )
99 in which case the value
100 \-1 is returned and the global variable
101 .Va errno
102 is set to
103 .Er EAGAIN .
104 The receive calls normally return any data available,
105 up to the requested amount,
106 rather than waiting for receipt of the full amount requested;
107 this behavior is affected by the socket-level options
108 .Dv SO_RCVLOWAT
109 and
110 .Dv SO_RCVTIMEO
111 described in
112 .Xr getsockopt 2 .
113 .Pp
114 The
115 .Xr select 2
116 system call may be used to determine when more data arrives.
117 .Pp
118 The
119 .Fa flags
120 argument to a
121 .Fn recv
122 function is formed by
123 .Em or Ap ing
124 one or more of the values:
125 .Bl -column ".Dv MSG_DONTWAIT" -offset indent
126 .It Dv MSG_OOB Ta process out-of-band data
127 .It Dv MSG_PEEK Ta peek at incoming message
128 .It Dv MSG_WAITALL Ta wait for full request or error
129 .It Dv MSG_DONTWAIT Ta do not block
130 .El
131 .Pp
132 The
133 .Dv MSG_OOB
134 flag requests receipt of out-of-band data
135 that would not be received in the normal data stream.
136 Some protocols place expedited data at the head of the normal
137 data queue, and thus this flag cannot be used with such protocols.
138 The
139 .Dv MSG_PEEK
140 flag causes the receive operation to return data
141 from the beginning of the receive queue without removing that
142 data from the queue.
143 Thus, a subsequent receive call will return the same data.
144 The
145 .Dv MSG_WAITALL
146 flag requests that the operation block until
147 the full request is satisfied.
148 However, the call may still return less data than requested
149 if a signal is caught, an error or disconnect occurs,
150 or the next data to be received is of a different type than that returned.
151 The
152 .Dv MSG_DONTWAIT
153 flag requests the call to return when it would block otherwise.
154 If no data is available,
155 .Va errno
156 is set to
157 .Er EAGAIN .
158 This flag is not available in strict
159 .Tn ANSI
160 or C99 compilation mode.
161 .Pp
162 The
163 .Fn recvmsg
164 system call uses a
165 .Fa msghdr
166 structure to minimize the number of directly supplied arguments.
167 This structure has the following form, as defined in
168 .In sys/socket.h :
169 .Pp
170 .Bd -literal
171 struct msghdr {
172         void            *msg_name;      /* optional address */
173         socklen_t        msg_namelen;   /* size of address */
174         struct iovec    *msg_iov;       /* scatter/gather array */
175         int              msg_iovlen;    /* # elements in msg_iov */
176         void            *msg_control;   /* ancillary data, see below */
177         socklen_t        msg_controllen;/* ancillary data buffer len */
178         int              msg_flags;     /* flags on received message */
179 };
180 .Ed
181 .Pp
182 Here
183 .Fa msg_name
184 and
185 .Fa msg_namelen
186 specify the destination address if the socket is unconnected;
187 .Fa msg_name
188 may be given as a null pointer if no names are desired or required.
189 The
190 .Fa msg_iov
191 and
192 .Fa msg_iovlen
193 arguments
194 describe scatter gather locations, as discussed in
195 .Xr read 2 .
196 The
197 .Fa msg_control
198 argument,
199 which has length
200 .Fa msg_controllen ,
201 points to a buffer for other protocol control related messages
202 or other miscellaneous ancillary data.
203 The messages are of the form:
204 .Bd -literal
205 struct cmsghdr {
206         socklen_t  cmsg_len;    /* data byte count, including hdr */
207         int        cmsg_level;  /* originating protocol */
208         int        cmsg_type;   /* protocol-specific type */
209 /* followed by
210         u_char     cmsg_data[]; */
211 };
212 .Ed
213 .Pp
214 As an example, one could use this to learn of changes in the data-stream
215 in XNS/SPP, or in ISO, to obtain user-connection-request data by requesting
216 a
217 .Fn recvmsg
218 with no data buffer provided immediately after an
219 .Fn accept
220 system call.
221 .Pp
222 Open file descriptors are now passed as ancillary data for
223 .Dv AF_UNIX
224 domain sockets, with
225 .Fa cmsg_level
226 set to
227 .Dv SOL_SOCKET
228 and
229 .Fa cmsg_type
230 set to
231 .Dv SCM_RIGHTS .
232 .Pp
233 Process credentials can also be passed as ancillary data for
234 .Dv AF_UNIX
235 domain sockets using a
236 .Fa cmsg_type
237 of
238 .Dv SCM_CREDS .
239 In this case,
240 .Fa cmsg_data
241 should be a structure of type
242 .Fa cmsgcred ,
243 which is defined in
244 .In sys/socket.h
245 as follows:
246 .Pp
247 .Bd -literal
248 struct cmsgcred {
249         pid_t   cmcred_pid;             /* PID of sending process */
250         uid_t   cmcred_uid;             /* real UID of sending process */
251         uid_t   cmcred_euid;            /* effective UID of sending process */
252         gid_t   cmcred_gid;             /* real GID of sending process */
253         short   cmcred_ngroups;         /* number or groups */
254         gid_t   cmcred_groups[CMGROUP_MAX];     /* groups */
255 };
256 .Ed
257 .Pp
258 The kernel will fill in the credential information of the sending process
259 and deliver it to the receiver.
260 .Pp
261 The
262 .Fa msg_flags
263 field is set on return according to the message received.
264 .Dv MSG_EOR
265 indicates end-of-record;
266 the data returned completed a record (generally used with sockets of type
267 .Dv SOCK_SEQPACKET ) .
268 .Dv MSG_TRUNC
269 indicates that
270 the trailing portion of a datagram was discarded because the datagram
271 was larger than the buffer supplied.
272 .Dv MSG_CTRUNC
273 indicates that some
274 control data were discarded due to lack of space in the buffer
275 for ancillary data.
276 .Dv MSG_OOB
277 is returned to indicate that expedited or out-of-band data were received.
278 .Sh RETURN VALUES
279 These calls return the number of bytes received, or -1
280 if an error occurred.
281 .Sh ERRORS
282 The calls fail if:
283 .Bl -tag -width Er
284 .It Bq Er EBADF
285 The argument
286 .Fa s
287 is an invalid descriptor.
288 .It Bq Er ECONNRESET
289 The remote socket end is forcibly closed.
290 .It Bq Er ENOTCONN
291 The socket is associated with a connection-oriented protocol
292 and has not been connected (see
293 .Xr connect 2
294 and
295 .Xr accept 2 ) .
296 .It Bq Er ENOTSOCK
297 The argument
298 .Fa s
299 does not refer to a socket.
300 .It Bq Er EMSGSIZE
301 The
302 .Fn recvmsg
303 system call
304 was used to receive rights (file descriptors) that were in flight on the
305 connection.
306 However, the receiving program did not have enough free file
307 descriptor slots to accept them.
308 In this case the descriptors are
309 closed, any pending data can be returned by another call to
310 .Fn recvmsg .
311 .It Bq Er EAGAIN
312 The socket is marked non-blocking, and the receive operation
313 would block, or
314 a receive timeout had been set,
315 and the timeout expired before data were received.
316 .It Bq Er EINTR
317 The receive was interrupted by delivery of a signal before
318 any data were available.
319 .It Bq Er EFAULT
320 The receive buffer pointer(s) point outside the process's
321 address space.
322 .El
323 .Sh SEE ALSO
324 .Xr fcntl 2 ,
325 .Xr getsockopt 2 ,
326 .Xr read 2 ,
327 .Xr select 2 ,
328 .Xr socket 2
329 .Sh HISTORY
330 The
331 .Fn recv
332 function appeared in
333 .Bx 4.2 .