 f14fb60209
			
		
	
	
		f14fb60209
		
	
	
	
	
		
			
			* Updating common/lib * Updating lib/csu * Updating lib/libc * Updating libexec/ld.elf_so * Corrected test on __minix in featuretest to actually follow the meaning of the comment. * Cleaned up _REENTRANT-related defintions. * Disabled -D_REENTRANT for libfetch * Removing some unneeded __NBSD_LIBC defines and tests Change-Id: Ic1394baef74d11b9f86b312f5ff4bbc3cbf72ce2
		
			
				
	
	
		
			366 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .\"	$NetBSD: recv.2,v 1.35 2012/06/23 05:47:50 dholland Exp $
 | |
| .\"
 | |
| .\" Copyright (c) 1983, 1990, 1991, 1993
 | |
| .\"	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. 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.
 | |
| .\"
 | |
| .\"     @(#)recv.2	8.3 (Berkeley) 2/21/94
 | |
| .\"
 | |
| .Dd June 22, 2012
 | |
| .Dt RECV 2
 | |
| .Os
 | |
| .Sh NAME
 | |
| .Nm recv ,
 | |
| .Nm recvfrom ,
 | |
| .Nm recvmsg ,
 | |
| .Nm recvmmsg
 | |
| .Nd receive a message from a socket
 | |
| .Sh LIBRARY
 | |
| .Lb libc
 | |
| .Sh SYNOPSIS
 | |
| .In sys/socket.h
 | |
| .Ft ssize_t
 | |
| .Fn recv "int s" "void *buf" "size_t len" "int flags"
 | |
| .Ft ssize_t
 | |
| .Fn recvfrom "int s" "void * restrict buf" "size_t len" "int flags" "struct sockaddr * restrict from" "socklen_t * restrict fromlen"
 | |
| .Ft ssize_t
 | |
| .Fn recvmsg "int s" "struct msghdr *msg" "int flags"
 | |
| .Ft int
 | |
| .Fn recvmmsg "int s" "struct mmsghdr *mmsg" "unsigned int vlen" "unsigned int flags" "struct timespec *timeout"
 | |
| .Sh DESCRIPTION
 | |
| .Fn recvfrom ,
 | |
| .Fn recvmsg
 | |
| and
 | |
| .Fn recvmmsg
 | |
| 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
 | |
| .Fa from
 | |
| is non-nil, and the socket is not connection-oriented,
 | |
| the source address of the message is filled in.
 | |
| .Fa fromlen
 | |
| is a value-result parameter, initialized to the size of
 | |
| the buffer associated with
 | |
| .Fa from ,
 | |
| and modified on return to indicate the actual size of the
 | |
| address stored there.
 | |
| .Pp
 | |
| The
 | |
| .Fn recvmmsg
 | |
| call be used to receive multiple messages in the same call using an array of
 | |
| .Fa mmsghdr
 | |
| elements with the following form, as defined in
 | |
| .Ao Pa sys/socket.h Ac :
 | |
| .Pp
 | |
| .Bd -literal
 | |
| struct mmsghdr {
 | |
| 	struct msghdr	msg_hdr;	/* the message to be sent */
 | |
| 	unsigned int	msg_len;	/* number of bytes received */
 | |
| };
 | |
| .Ed
 | |
| .Pp
 | |
| The
 | |
| .Fa msg_len
 | |
| member contains the number of bytes received for each
 | |
| .Fa msg_hdr
 | |
| member.
 | |
| The array has
 | |
| .Fa vlen
 | |
| elements, which is limited to
 | |
| .Dv 1024 .
 | |
| If there is an error, a number fewer than
 | |
| .Fa vlen
 | |
| may be returned, and the error may be retrieved using
 | |
| .Xr getsockopt 2
 | |
| with
 | |
| .Dv SO_ERROR .
 | |
| If the flag
 | |
| .Dv MSG_WAITFORONE
 | |
| is set in
 | |
| .Fa flags
 | |
| then the
 | |
| .Fn recvmmsg
 | |
| call will wait for one message, and set
 | |
| .Dv MSG_DONTWAIT
 | |
| for the rest.
 | |
| If the
 | |
| .Fa timeout
 | |
| parameter is not
 | |
| .Dv NULL ,
 | |
| then
 | |
| .Fn recvmmsg
 | |
| will return if that time is exceeded.
 | |
| .Pp
 | |
| The
 | |
| .Fn recv
 | |
| call is normally used only on a
 | |
| .Em connected
 | |
| socket (see
 | |
| .Xr connect 2 )
 | |
| and is identical to
 | |
| .Fn recvfrom
 | |
| with a nil
 | |
| .Fa from
 | |
| parameter.
 | |
| As it is redundant, it may not be supported in future releases.
 | |
| .Pp
 | |
| .Fn recv ,
 | |
| .Fn recvfrom
 | |
| and
 | |
| .Fn recvmsg
 | |
| routines return the length of the message on successful
 | |
| completion.
 | |
| .Fn recvmmsg
 | |
| returns the number of messages received.
 | |
| 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
 | |
| .Xr socket 2 ) .
 | |
| .Pp
 | |
| If no messages are available at the socket, the
 | |
| receive call waits for a message to arrive, unless
 | |
| the socket is nonblocking (see
 | |
| .Xr fcntl 2 )
 | |
| in which case the value
 | |
| \-1 is returned and the external variable
 | |
| .Va errno
 | |
| set to
 | |
| .Er EAGAIN .
 | |
| If no data is available and the remote peer was shut down,
 | |
| 0 is returned.
 | |
| The receive calls normally return any data available,
 | |
| up to the requested amount,
 | |
| rather than waiting for receipt of the full amount requested;
 | |
| this behavior is affected by the socket-level options
 | |
| .Dv SO_RCVLOWAT
 | |
| and
 | |
| .Dv SO_RCVTIMEO
 | |
| described in
 | |
| .Xr getsockopt 2 .
 | |
| .Pp
 | |
| The
 | |
| .Xr select 2
 | |
| or
 | |
| .Xr poll 2
 | |
| call may be used to determine when more data arrive.
 | |
| .Pp
 | |
| The
 | |
| .Fa flags
 | |
| argument to a recv call is formed by
 | |
| .Em or Ap ing
 | |
| one or more of the values:
 | |
| .Bl -column MSG_CMSG_CLOEXEC -offset indent
 | |
| .It Dv MSG_CMSG_CLOEXEC Ta set the close on exec property for passed file descriptors
 | |
| .It Dv MSG_OOB Ta process out-of-band data
 | |
| .It Dv MSG_PEEK Ta peek at incoming message
 | |
| .It Dv MSG_WAITALL Ta wait for full request or error
 | |
| .El
 | |
| The
 | |
| .Dv MSG_OOB
 | |
| 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.
 | |
| The
 | |
| .Dv MSG_PEEK
 | |
| 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.
 | |
| The
 | |
| .Dv MSG_WAITALL
 | |
| 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.
 | |
| .Pp
 | |
| The
 | |
| .Fn recvmsg
 | |
| call uses a
 | |
| .Fa msghdr
 | |
| structure to minimize the number of directly supplied parameters.
 | |
| This structure has the following form, as defined in
 | |
| .Ao Pa sys/socket.h Ac :
 | |
| .Pp
 | |
| .Bd -literal
 | |
| struct msghdr {
 | |
| 	void		*msg_name;	/* optional address */
 | |
| 	socklen_t	msg_namelen;	/* size of address */
 | |
| 	struct iovec	*msg_iov;	/* scatter/gather array */
 | |
| 	int		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 */
 | |
| };
 | |
| .Ed
 | |
| .Pp
 | |
| Here
 | |
| .Fa msg_name
 | |
| and
 | |
| .Fa msg_namelen
 | |
| specify the source address if the socket is unconnected;
 | |
| .Fa msg_name
 | |
| may be given as a null pointer if no names are desired or required.
 | |
| If the socket is connected,
 | |
| .Fa msg_name
 | |
| and
 | |
| .Fa msg_namelen
 | |
| are ignored.
 | |
| .Fa msg_iov
 | |
| and
 | |
| .Fa msg_iovlen
 | |
| describe scatter gather locations, as discussed in
 | |
| .Xr read 2 .
 | |
| .Fa msg_control ,
 | |
| which has length
 | |
| .Fa msg_controllen ,
 | |
| points to a buffer for other protocol control related messages
 | |
| or other miscellaneous ancillary data.
 | |
| The messages are of the form:
 | |
| .Bd -literal
 | |
| 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[]; */
 | |
| };
 | |
| .Ed
 | |
| As an example, one could use this to learn of changes in the data-stream
 | |
| in XNS/SPP, or in ISO, to obtain user-connection-request data by requesting
 | |
| a recvmsg with no data buffer provided immediately after an
 | |
| .Fn accept
 | |
| call.
 | |
| .Pp
 | |
| Open file descriptors are now passed as ancillary data for
 | |
| .Dv AF_LOCAL
 | |
| domain sockets, with
 | |
| .Fa cmsg_level
 | |
| set to
 | |
| .Dv SOL_SOCKET
 | |
| and
 | |
| .Fa cmsg_type
 | |
| set to
 | |
| .Dv SCM_RIGHTS .
 | |
| .Pp
 | |
| The
 | |
| .Fa msg_flags
 | |
| field is set on return according to the message received.
 | |
| .Dv MSG_EOR
 | |
| indicates end-of-record;
 | |
| the data returned completed a record (generally used with sockets of type
 | |
| .Dv SOCK_SEQPACKET ) .
 | |
| .Dv MSG_TRUNC
 | |
| indicates that
 | |
| the trailing portion of a datagram was discarded because the datagram
 | |
| was larger than the buffer supplied.
 | |
| .Dv MSG_CTRUNC
 | |
| indicates that some
 | |
| control data were discarded due to lack of space in the buffer
 | |
| for ancillary data.
 | |
| .Dv MSG_OOB
 | |
| is returned to indicate that expedited or out-of-band data were received.
 | |
| .Sh RETURN VALUES
 | |
| The
 | |
| .Fn recv ,
 | |
| .Fn recvfrom
 | |
| and
 | |
| .Fn recvmsg
 | |
| calls return the number of bytes received, or \-1
 | |
| if an error occurred.
 | |
| For connected sockets whose remote peer was shut down,
 | |
| 0 is returned when no more data is available.
 | |
| The
 | |
| .Fn recvmmsg
 | |
| calls return the number of messages received, or \-1
 | |
| if an error occurred.
 | |
| .Sh ERRORS
 | |
| The calls fail if:
 | |
| .Bl -tag -width Er
 | |
| .It Bq Er 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 were received.
 | |
| .It Bq Er EBADF
 | |
| The argument
 | |
| .Fa s
 | |
| is an invalid descriptor.
 | |
| .It Bq Er EFAULT
 | |
| The receive buffer pointer(s) point outside the process's
 | |
| address space.
 | |
| .It Bq Er EINTR
 | |
| The receive was interrupted by delivery of a signal before
 | |
| any data were available.
 | |
| .It Bq Er EINVAL
 | |
| The total length of the I/O is more than can be expressed by the ssize_t
 | |
| return value.
 | |
| .It Bq Er ENOTCONN
 | |
| The socket is associated with a connection-oriented protocol
 | |
| and has not been connected (see
 | |
| .Xr connect 2
 | |
| and
 | |
| .Xr accept 2 ) .
 | |
| .It Bq Er ENOTSOCK
 | |
| The argument
 | |
| .Fa s
 | |
| does not refer to a socket.
 | |
| .El
 | |
| .Pp
 | |
| .Fn recvmsg
 | |
| will also fail if:
 | |
| .Bl -tag -width Er
 | |
| .It Bq Er EMSGSIZE
 | |
| The
 | |
| .Fa msg_iovlen
 | |
| member of the
 | |
| .Fa msg
 | |
| structure is less than or equal to 0
 | |
| or is greater than
 | |
| .Dv {IOV_MAX} .
 | |
| .El
 | |
| .Sh SEE ALSO
 | |
| .Xr fcntl 2 ,
 | |
| .Xr getsockopt 2 ,
 | |
| .Xr poll 2 ,
 | |
| .Xr read 2 ,
 | |
| .Xr select 2 ,
 | |
| .Xr socket 2
 | |
| .Sh HISTORY
 | |
| The
 | |
| .Fn recv
 | |
| function call appeared in
 | |
| .Bx 4.2 .
 | |
| The
 | |
| .Fn recvmmsg
 | |
| function call appeared in
 | |
| .Tn Linux 2.6.32
 | |
| and
 | |
| .Nx 7.0 .
 |