Content-type: text/html
int TCBrecvfrom(void* buff, int nbytes, unsigned int flags, struct sockaddr* from, int *addrlen, TCBsocketDesc* desc, TCBtimestamp *delivery_evt, TCBtimeinterval* delay, TCBtimeinterval* error, char block);
TCBrecvfrom returns the length of the message on successful completion.
TCBsocketDesc* desc, TCBtimestamp *delivery_evt, TCBtimeinterval* delay, TCBtimeinterval* error, char block);" The parameter desc is the descriptor of the TCB socket. *delivery_evt is a pointer to a variable that the TCB will sets with the termination event of the observed interval (nanosecond resolution). *delay is a pointer to a variable that the TCB will sets with the delay of the observed interval (nanosecond resolution). *error is a pointer to a variable that the TCB will sets with the maximum error associated with the measurement (nanosecond resolution). block specifies if the function should block or not if there's no available data on the socket. NON_BLOCKING or BLOCKING.
The flags argument to a recv call is formed by OR'ing one or more of the following values:
The error is supplied in a sock_extended_err structure:
#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 *SOCK_EE_OFFENDER(struct sock_extended_err *);
The recvmsg call uses a msghdr structure to minimize the number of directly supplied parameters. This structure has the following form, as defined in <sys/socket.h>:
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 */ };
Here msg_name and msg_namelen specify the destination address if the socket is unconnected; msg_name may be given as a null pointer if no names are desired or required. The fields msg_iov and msg_iovlen describe scatter-gather locations, as discussed in readv(2). The field msg_control, which has length msg_controllen, points to a buffer for other protocol control related messages or miscellaneous ancillary data. When recvmsg is called, msg_controllen should contain the length of the available buffer in msg_control; upon return from a successful call it will contain the length of the control message sequence.
The messages are of the form:
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[]; */ };
Ancillary data should only be accessed by the macros defined in cmsg(3).
As an example, Linux uses this auxiliary data mechanism to pass extended errors, IP options or file descriptors over Unix sockets.
The msg_flags field is set on return according to the message received. MSG_EOR indicates end-of-record; the data returned completed a record (generally used with sockets of type SOCK_SEQPACKET). MSG_TRUNC indicates that the trailing portion of a datagram was discarded because the datagram was larger than the buffer supplied. MSG_CTRUNC indicates that some control data were discarded due to lack of space in the buffer for ancillary data. MSG_OOB is returned to indicate that expedited or out-of-band data were received. MSG_ERRQUEUE indicates that no data was received but an extended error from the socket error queue.
The function returns the number of bytes received, or 0 if there's no available information on the socket on a non blocking call.
TCB_ACESS_ERROR if an error occurred on the access to the TCB.
if errno!=0
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.
recvfrom (2), TCBsocket, TCBbind (1), TCBwinfoport (1), TCBsendto (1), TCBsendtoWFD (1), TCBsocketClose (1)