recvfrom
The Windows
Sockets recvfrom function receives a datagram and stores the source
address.
int recvfrom (
SOCKET s, |
|
char FAR* buf, |
|
int len, |
|
int flags, |
|
struct
sockaddr FAR* from, |
|
int FAR* fromlen |
|
); |
|
Parameters
s
[in] A
descriptor identifying a bound socket.
buf
[out] A
buffer for the incoming data.
len
[in] The
length of buf.
flags
[in]
Specifies the way in which the call is made.
from
[out] An
optional pointer to a buffer which will hold the source address upon return.
fromlen
[in/out] An
optional pointer to the size of the from buffer.
Remarks
This function
is used to read incoming data on a (possibly connected) socket and capture the
address from which the data was sent.
For
stream-oriented sockets such as those of type SOCK_STREAM, as much information
as is currently available up to the size of the buffer supplied is returned. If
the socket has been configured for in-line reception of out-of-band data
(socket option SO_OOBINLINE) and out-of-band data is unread, only out-of-band
data will be returned. The application can use the ioctlsocket
SIOCATMARK to determine whether any more out-of-band data remains to be read.
The from and fromlen parameters are ignored for
connection-oriented sockets.
For
message-oriented sockets, data is extracted from the first enqueued message, up
to the size of the buffer supplied. If the datagram or message is larger than
the buffer supplied, the buffer is filled with the first part of the datagram,
and recvfrom generates the error WSAEMSGSIZE. For unreliable protocols
(for example, UDP) the excess data is lost.
If from
is nonzero, and the socket is not connection oriented (for example, type
SOCK_DGRAM), the network address of the peer which sent the data is copied to
the corresponding struct sockaddr. The value pointed to by fromlen is
initialized to the size of this structure, and is modified on return to
indicate the actual size of the address stored there.
If no
incoming data is available at the socket, the recvfrom call waits for
data to arrive unless the socket is nonblocking. In this case, a value of
SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The select,
WSAAsyncSelect, or WSAEventSelect can be used to determine when
more data arrives.
If the socket
is connection oriented and the remote side has shut down the connection
gracefully, a recvfrom will complete immediately with zero bytes
received. If the connection has been reset recvfrom will fail with the
error WSAECONNRESET.
Flags can be used to influence the behavior of the function
invocation beyond the options specified for the associated socket. That is, the
semantics of this function are determined by the socket options and the flags
parameter. The latter is constructed by or-ing any of the following values:
Value |
Meaning |
MSG_PEEK |
Peek at the
incoming data. The data is copied into the buffer but is not removed from the
input queue. |
MSG_OOB |
Process
out-of-band data. (See section Out-Of-Band dataVFXYGI for a discussion of this topic.) |
Return Values
If no error
occurs, recvfrom returns the number of bytes received. If the connection
has been gracefully closed, the return value is zero. Otherwise, a value of
SOCKET_ERROR is returned, and a specific error code can be retrieved by calling
WSAGetLastError.
Error Codes
WSANOTINITIALISED |
A successful
WSAStartup must occur before using this function. |
WSAENETDOWN |
The network
subsystem has failed. |
WSAEFAULT |
The buf or
from parameters are not part of the user address space, or the fromlen
argument is too small to accommodate the peer address. |
WSAEINTR |
The
(blocking) call was canceled through WSACancelBlockingCall. |
WSAEINPROGRESS |
A blocking
Windows Sockets 1.1 call is in progress, or the service provider is still
processing a callback function. |
WSAEINVAL |
The socket
has not been bound with bind, or an unknown flag was specified, or
MSG_OOB was specified for a socket with SO_OOBINLINE enabled, or (for byte
stream style sockets only) len was zero or negative. |
WSAENETRESET |
The
connection has been broken due to the remote host resetting. |
WSAENOTCONN |
The socket
is not connected (connection-oriented sockets only). |
WSAENOTSOCK |
The
descriptor is not a socket. |
WSAEOPNOTSUPP |
MSG_OOB was
specified, but the socket is not stream style such as type SOCK_STREAM,
out-of-band data is not supported in the communication domain associated with
this socket, or the socket is unidirectional and supports only send
operations. |
WSAESHUTDOWN |
The socket
has been shut down; it is not possible to recvfrom on a socket after shutdown
has been invoked with how set to SD_RECEIVE or SD_BOTH. |
WSAEWOULDBLOCK |
The socket
is marked as nonblocking and the recvfrom operation would block. |
WSAEMSGSIZE |
The message
was too large to fit into the specified buffer and was truncated. |
WSAECONNABORTED |
The virtual
circuit was terminated due to a time-out or other failure. The application
should close the socket as it is no longer usable. |
WSAETIMEDOUT |
The
connection has been dropped, because of a network failure or because the
system on the other end went down without notice. |
WSAECONNRESET |
The virtual
circuit was reset by the remote side executing a hard or abortive
close. The application should close the socket as it is no longer usable. On
a UDP datagram socket this error would indicate that a previous send
operation resulted in an ICMP "Port Unreachable" message. |
See Also