|
|
1.1 root 1: .\" Copyright (c) 1983, 1990 The Regents of the University of California.
2: .\" All rights reserved.
3: .\"
4: .\" Redistribution and use in source and binary forms are permitted
5: .\" provided that: (1) source distributions retain this entire copyright
6: .\" notice and comment, and (2) distributions including binaries display
7: .\" the following acknowledgement: ``This product includes software
8: .\" developed by the University of California, Berkeley and its contributors''
9: .\" in the documentation or other materials provided with the distribution
10: .\" and in all advertising materials mentioning features or use of this
11: .\" software. Neither the name of the University nor the names of its
12: .\" contributors may be used to endorse or promote products derived
13: .\" from this software without specific prior written permission.
14: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15: .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17: .\"
18: .\" @(#)recv.2 6.8 (Berkeley) 5/30/90
19: .\"
20: .TH RECV 2 "May 30, 1990"
21: .UC 5
22: .SH NAME
23: recv, recvfrom, recvmsg \- receive a message from a socket
24: .SH SYNOPSIS
25: .nf
26: .ft B
27: #include <sys/types.h>
28: #include <sys/socket.h>
29: .PP
30: .ft B
31: cc = recv(s, buf, len, flags)
32: int cc, s;
33: char *buf;
34: int len, flags;
35: .PP
36: .ft B
37: cc = recvfrom(s, buf, len, flags, from, fromlen)
38: int cc, s;
39: char *buf;
40: int len, flags;
41: struct sockaddr *from;
42: int *fromlen;
43: .PP
44: .ft B
45: cc = recvmsg(s, msg, flags)
46: int cc, s;
47: struct msghdr *msg;
48: int flags;
49: .ft R
50: .SH DESCRIPTION
51: .IR Recvfrom ,
52: and
53: .IR recvmsg
54: are used to receive messages from a socket,
55: and may be used to receive data on a socket whether
56: it is in a connected state or not.
57: .PP
58: If
59: .I from
60: is non-zero, the source address of the message is filled in.
61: .I Fromlen
62: is a value-result parameter, initialized to the size of
63: the buffer associated with
64: .IR from ,
65: and modified on return to indicate the actual size of the
66: address stored there.
67: .PP
68: The
69: .I recv
70: call is normally used only on a
71: .I connected
72: socket (see
73: .IR connect (2))
74: and is identitical to
75: .I recfrom
76: with a zero-valued
77: .I fromlen
78: parameter.
79: As it is redundant, it may not be supported in future releases.
80: .PP
81: The length of the message is returned in
82: .IR cc .
83: If a message is too long to fit in the supplied buffer,
84: excess bytes may be discarded depending on the type of socket
85: the message is received from (see
86: .IR socket (2)).
87: .PP
88: If no messages are available at the socket, the
89: receive call waits for a message to arrive, unless
90: the socket is nonblocking (see
91: .IR ioctl (2))
92: in which case a
93: .I cc
94: of \-1 is returned with the external variable errno
95: set to EWOULDBLOCK.
96: .PP
97: The
98: .IR select (2)
99: call may be used to determine when more data arrives.
100: .PP
101: The
102: .I flags
103: argument to a recv call is formed by
104: .IR or 'ing
105: one or more of the values,
106: .PP
107: .nf
108: .RS
109: .ta \w'#define\ \ 'u +\w'MSG_DONTROUTE\ \ \ 'u +\w'0x\0\0\0\ \ 'u
110: #define MSG_OOB 0x1 /* process out-of-band data */
111: #define MSG_PEEK 0x2 /* peek at incoming message */
112: #define MSG_DONTROUTE 0x4 /* send without using routing tables */
113: #define MSG_EOR 0x8 /* data completes record */
114: #define MSG_TRUNC 0x10 /* data discarded before delivery */
115: #define MSG_CTRUNC 0x20 /* control data lost before delivery */
116: .RE
117: .fi
118: .PP
119: The
120: .I recvmsg
121: call uses a
122: .I msghdr
123: structure to minimize the number of directly supplied parameters.
124: This structure has the following form, as defined in
125: .IR <sys/socket.h> :
126: .PP
127: .nf
128: .ta \w'struct 'u +\w'caddr_t 'u +\w'msg_controllen 'u
129: struct msghdr {
130: caddr_t msg_name; /* optional address */
131: u_int msg_namelen; /* size of address */
132: struct iovec *msg_iov; /* scatter/gather array */
133: u_int msg_iovlen; /* # elements in msg_iov */
134: caddr_t msg_control; /* ancillary data, see below */
135: u_int msg_controllen; /* ancillary data buffer len */
136: int msg_flags; /* flags on received message */
137: };
138: .fi
139: .PP
140: Here
141: .I msg_name
142: and
143: .I msg_namelen
144: specify the destination address if the socket is unconnected;
145: .I msg_name
146: may be given as a null pointer if no names are desired or required.
147: The
148: .I msg_iov
149: and
150: .I msg_iovlen
151: describe the scatter gather locations, as described in
152: .IR read (2).
153: .IR msg_control ,
154: which has length
155: .IR msg_controllen .
156: This is a buffer for other protocol control related messages
157: or other miscellaneous ancillary data.
158: The messages are of the form:
159: .PP
160: .nf
161: .ta \w'struct 'u +\w'u_char 'u +\w'msg_controllen 'u
162: struct cmsghdr {
163: u_int cmsg_len; /* data byte count, including hdr */
164: int cmsg_level; /* originating protocol */
165: int cmsg_type; /* protocol-specific type */
166: /* followed by
167: u_char cmsg_data[]; */
168: };
169: .fi
170: .RE
171: As an example, one could use this to learn of changes in the data-stream
172: in XNS/SPP, or in ISO, to obtain user-connection-request data by requesting
173: a recvmsg with no uio provided immediately after an
174: .IR accept (),
175: thought of here in the sense of get-next-connection-request without
176: an implicit connection confirmation.
177: .PP
178: Open file descriptors are now passed as ancillary data for AF_UNIX
179: domain sockets, with cmsg_level being SOL_SOCKET and cmsg_type being
180: SCM_RIGHTS.
181: .PP
182: .I msg_flags
183: is set on return in a way that may include some of the same values specified
184: for the flags parameter to a recv system call.
185: The returned values MSG_EOR indicates end-of-record, MSG_TRUNC indicates that
186: some trailing datagram data was discarded, MSG_CTRUNC indicates that some
187: control data was discarded due to lack of space.
188: MSG_OOB is returned to indicate that expedited data was received.
189: .PP
190: .SH "RETURN VALUE"
191: These calls return the number of bytes received, or \-1
192: if an error occurred.
193: .SH ERRORS
194: The calls fail if:
195: .TP 20
196: [EBADF]
197: The argument \fIs\fP is an invalid descriptor.
198: .TP 20
199: [ENOTSOCK]
200: The argument \fIs\fP is not a socket.
201: .TP 20
202: [EWOULDBLOCK]
203: The socket is marked non-blocking and the receive operation
204: would block.
205: .TP 20
206: [EINTR]
207: The receive was interrupted by delivery of a signal before
208: any data was available for the receive.
209: .TP 20
210: [EFAULT]
211: The data was specified to be received into a non-existent
212: or protected part of the process address space.
213: .SH SEE ALSO
214: fcntl(2), read(2), send(2), select(2), getsockopt(2), socket(2)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.