summaryrefslogtreecommitdiffstats
path: root/man2/recv.2
diff options
context:
space:
mode:
Diffstat (limited to 'man2/recv.2')
-rw-r--r--man2/recv.2424
1 files changed, 424 insertions, 0 deletions
diff --git a/man2/recv.2 b/man2/recv.2
new file mode 100644
index 000000000..a3feed2ed
--- /dev/null
+++ b/man2/recv.2
@@ -0,0 +1,424 @@
+.\" Copyright (c) 1983, 1990, 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $Id: recv.2,v 1.3 1999/05/13 11:33:38 freitag Exp $
+.\"
+.\" Modified Sat Jul 24 00:22:20 1993 by Rik Faith <faith@cs.unc.edu>
+.\" Modified Tue Oct 22 17:45:19 1996 by Eric S. Raymond <esr@thyrsus.com>
+.\" Modified 1998,1999 by Andi Kleen
+.\" 2001-06-19 corrected SO_EE_OFFENDER, bug report by James Hawtin
+.\"
+.TH RECV 2 2002-12-31 "Linux Man Page" "Linux Programmer's Manual"
+.SH NAME
+recv, recvfrom, recvmsg \- receive a message from a socket
+.SH SYNOPSIS
+.\" .B #include <sys/uio.h>
+.\" .br
+.B #include <sys/types.h>
+.br
+.B #include <sys/socket.h>
+.sp
+.BI "ssize_t recv(int " s ", void *" buf ", size_t " len ", int " flags );
+.sp
+.BI "ssize_t recvfrom(int " s ", void *" buf ", size_t " len ,
+.BI "int " flags ", struct sockaddr *" from ", socklen_t *" fromlen );
+.sp
+.BI "ssize_t recvmsg(int " s ", struct msghdr *" msg ", int " flags );
+.SH DESCRIPTION
+The
+.B recvfrom
+and
+.B recvmsg
+calls are used to receive messages from a socket, and may be used
+to receive data on a socket whether or not it is connection-oriented.
+.PP
+If
+.I from
+is not NULL, and the underlying protocol provides the source address,
+this source address is filled in.
+.\" (Note: for datagram sockets in both the Unix and Internet domains,
+.\" .I from
+.\" is filled in.
+.\" .I from
+.\" is also filled in for stream sockets in the Unix domain, but is not
+.\" filled in for stream sockets in the Internet domain.)
+.\" [The above notes on AF_UNIX and AF_INET sockets apply as at
+.\" Kernel 2.4.18. (MTK, 22 Jul 02)]
+The argument
+.I fromlen
+is a value-result parameter, initialized to the size of the buffer
+associated with
+.IR from ,
+and modified on return to indicate the actual size of the address stored
+there.
+.PP
+The
+.B recv
+call is normally used only on a
+.I connected
+socket (see
+.BR connect (2))
+and is identical to
+.B recvfrom
+with a NULL
+.I from
+parameter.
+.PP
+All three routines return the length of the message on successful
+completion. If a message is too long to fit in the supplied buffer, excess
+bytes may be discarded depending on the type of socket the message is
+received from (see
+.BR socket (2)).
+.PP
+If no messages are available at the socket, the receive calls wait for a
+message to arrive, unless the socket is nonblocking (see
+.BR fcntl (2))
+in which case the value \-1 is returned and the external variable
+.I errno
+set to
+.BR EAGAIN .
+The receive calls normally return any data available, up to the requested
+amount, rather than waiting for receipt of the full amount requested.
+.PP
+The
+.BR select (2)
+or
+.BR poll (2)
+call may be used to determine when more data arrives.
+.PP
+The
+.I flags
+argument to a recv call is formed by
+.IR OR 'ing
+one or more of the following values:
+.TP
+.B MSG_OOB
+This flag requests receipt of out-of-band data that would not be received
+in the normal data stream. Some protocols place expedited data
+at the head of the normal data queue, and thus this flag cannot
+be used with such protocols.
+.TP
+.B MSG_PEEK
+This flag causes the receive operation to return data from the beginning of the
+receive queue without removing that data from the queue. Thus, a
+subsequent receive call will return the same data.
+.TP
+.B MSG_WAITALL
+This flag requests that the operation block until the full request is
+satisfied. However, the call may still return less data than requested if
+a signal is caught, an error or disconnect occurs, or the next data to be
+received is of a different type than that returned.
+.TP
+.B MSG_TRUNC
+Return the real length of the packet, even when it was longer than
+the passed buffer. Only valid for packet sockets.
+.TP
+.B MSG_ERRQUEUE
+This flag
+specifies that queued errors should be received from the socket error queue.
+The error is passed in
+an ancillary message with a type dependent on the protocol (for IPv4
+.BR IP_RECVERR ).
+The user should supply a buffer of sufficient size. See
+.BR cmsg (3)
+and
+.BR ip (7)
+for more information.
+The payload of the original packet that caused the error
+is passed as normal data via
+.BR msg_iovec .
+The original destination address of the datagram that caused the error
+is supplied via
+.BR msg_name .
+.IP
+For local errors, no address is passed (this can be checked with the
+.I cmsg_len
+member of the
+.BR cmsghdr ).
+For error receives, the
+.B MSG_ERRQUEUE
+is set in the
+.BR msghdr .
+After an error has been passed, the pending socket error
+is regenerated based on the next queued error and will be passed
+on the next socket operation.
+
+The error is supplied in a
+.B sock_extended_err
+structure:
+.IP
+.RS
+.ne 18
+.nf
+.ta 4n 20n 32n
+#define SO_EE_ORIGIN_NONE 0
+#define SO_EE_ORIGIN_LOCAL 1
+#define SO_EE_ORIGIN_ICMP 2
+#define SO_EE_ORIGIN_ICMP6 3
+
+struct sock_extended_err
+{
+ u_int32_t ee_errno; /* error number */
+ u_int8_t ee_origin; /* where the error originated */
+ u_int8_t ee_type; /* type */
+ u_int8_t ee_code; /* code */
+ u_int8_t ee_pad;
+ u_int32_t ee_info; /* additional information */
+ u_int32_t ee_data; /* other data */
+ /* More data may follow */
+};
+
+struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
+.ta
+.fi
+.RE
+.IP
+.B ee_errno
+contains the errno number of the queued error.
+.B ee_origin
+is the origin code of where the error originated.
+The other fields are protocol specific. The macro
+.B SOCK_EE_OFFENDER
+returns a pointer to the address of the network object
+where the error originated from given a pointer to the ancillary message.
+If this address is not known, the
+.I sa_family
+member of the
+.B sockaddr
+contains
+.B AF_UNSPEC
+and the other fields of the
+.B sockaddr
+are undefined. The payload of the packet
+that caused the error is passed as normal data.
+.IP
+For local errors, no address is passed (this
+can be checked with the
+.I cmsg_len
+member of the
+.BR cmsghdr ).
+For error receives,
+the
+.B MSG_ERRQUEUE
+is set in the
+.BR msghdr .
+After an error has been passed, the pending socket error
+is regenerated based on the next queued error and will be passed
+on the next socket operation.
+.PP
+The
+.B recvmsg
+call uses a
+.I msghdr
+structure to minimize the number of directly supplied parameters. This
+structure has the following form, as defined in
+.IR <sys/socket.h> :
+.IP
+.RS
+.nf
+.ta 4n 17n 33n
+struct msghdr {
+ void * msg_name; /* optional address */
+ socklen_t msg_namelen; /* size of address */
+ struct iovec * msg_iov; /* scatter/gather array */
+ size_t msg_iovlen; /* # elements in msg_iov */
+ void * msg_control; /* ancillary data, see below */
+ socklen_t msg_controllen; /* ancillary data buffer len */
+ int msg_flags; /* flags on received message */
+};
+.ta
+.fi
+.RE
+.PP
+Here
+.I msg_name
+and
+.I msg_namelen
+specify the source address if the socket is unconnected;
+.I msg_name
+may be given as a null pointer if no names are desired or required.
+The fields
+.I msg_iov
+and
+.I msg_iovlen
+describe scatter-gather locations, as discussed in
+.BR readv (2).
+The field
+.IR msg_control ,
+which has length
+.IR msg_controllen ,
+points to a buffer for other protocol control related messages or
+miscellaneous ancillary data. When
+.B recvmsg
+is called,
+.I msg_controllen
+should contain the length of the available buffer in
+.IR msg_control ;
+upon return from a successful call it will contain the length
+of the control message sequence.
+.PP
+The messages are of the form:
+.PP
+.RS
+.nf
+.ta 4n 16n 28n
+struct cmsghdr {
+ socklen_t cmsg_len; /* data byte count, including hdr */
+ int cmsg_level; /* originating protocol */
+ int cmsg_type; /* protocol-specific type */
+/* followed by
+ u_char cmsg_data[]; */
+};
+.ta
+.fi
+.RE
+.PP
+Ancillary data should only be accessed by the macros defined in
+.BR cmsg (3).
+.PP
+As an example, Linux uses this auxiliary data mechanism to pass extended
+errors, IP options or file descriptors over Unix sockets.
+.PP
+The
+.I msg_flags
+field in the msghdr is set on return of
+.BR recvmsg ().
+It can contain several flags:
+.TP
+.B MSG_EOR
+indicates end-of-record; the data returned completed a record (generally
+used with sockets of type
+.BR SOCK_SEQPACKET ).
+.TP
+.B MSG_TRUNC
+indicates that the trailing portion of a datagram was discarded because the
+datagram was larger than the buffer supplied.
+.TP
+.B MSG_CTRUNC
+indicates that some control data were discarded due to lack of space in the
+buffer for ancillary data.
+.TP
+.B MSG_OOB
+is returned to indicate that expedited or out-of-band data were received.
+.TP
+.B MSG_ERRQUEUE
+indicates that no data was received but an extended error from the socket
+error queue.
+.TP
+.B MSG_DONTWAIT
+Enables non-blocking operation; if the operation would block,
+.B EAGAIN
+is returned (this can also be enabled using the
+.B O_NONBLOCK
+with the
+.B F_SETFL
+.BR fcntl (2)).
+.SH "RETURN VALUE"
+These calls return the number of bytes received, or \-1
+if an error occurred. The return value will be 0 when the
+peer has performed an orderly shutdown.
+.SH ERRORS
+These are some standard errors generated by the socket layer. Additional errors
+may be generated and returned from the underlying protocol modules; see their
+manual pages.
+.TP
+.B EAGAIN
+The socket is marked non-blocking and the receive operation
+would block, or a receive timeout had been set and the timeout expired
+before data was received.
+.TP
+.B EBADF
+The argument
+.I s
+is an invalid descriptor.
+.TP
+.B ECONNREFUSED
+A remote host refused to allow the network connection (typically
+because it is not running the requested service).
+.TP
+.B EFAULT
+The receive buffer pointer(s) point outside the process's
+address space.
+.TP
+.B EINTR
+The receive was interrupted by delivery of a signal before
+any data were available.
+.TP
+.B EINVAL
+Invalid argument passed.
+.TP
+.B ENOMEM
+Could not allocate memory for recvmsg.
+.TP
+.B ENOTCONN
+The socket is associated with a connection-oriented protocol
+and has not been connected (see
+.BR connect (2)
+and
+.BR accept (2)).
+.TP
+.B ENOTSOCK
+The argument
+.I s
+does not refer to a socket.
+.SH "CONFORMING TO"
+4.4BSD (these function calls first appeared in 4.2BSD),
+POSIX 1003.1-2001.
+.LP
+POSIX only describes the
+.BR MSG_OOB ,
+.BR MSG_PEEK ,
+and
+.B MSG_WAITALL
+flags.
+.SH NOTE
+The prototypes given above follow glibc2.
+The Single Unix Specification agrees, except that it has return values
+of type `ssize_t' (while BSD 4.* and libc4 and libc5 all have `int').
+The
+.I flags
+argument is `int' in BSD 4.*, but `unsigned int' in libc4 and libc5.
+The
+.I len
+argument is `int' in BSD 4.*, but `size_t' in libc4 and libc5.
+The
+.I fromlen
+argument is `int *' in BSD 4.*, libc4 and libc5.
+The present `socklen_t *' was invented by POSIX.
+See also
+.BR accept (2).
+.SH "SEE ALSO"
+.BR fcntl (2),
+.BR getsockopt (2),
+.BR read (2),
+.BR select (2),
+.BR socket (2),
+.BR cmsg (3)